3

我正在尝试require一个模块,它是一个自调用 Javascript 函数,并在我传递一个参数时传递给require它。“必需”对象总是说“对象不是函数”。

以下代码是否可能,如果可以,我哪里出错了?

模块

var _ = require('lodash');

var userRepository = (function(userRecords) {

  console.log(userRecords);

  var findByUsername = function(username, cb) {

    //find username in the userNameData
    //this may have been retrieved from the DB or passed in as mock data from the tests
    var user = _.find(userRecords, {
      "email": username
    });

    if (user) {
      return cb(null, user);
    } else {
      return cb(null, null);
    }
  };

  return {
    findByUserName: findByUsername
  };

})();

module.exports = userRepository;

代码中的用法

var userData = require('../test/data/users.json'),
  userRepository = require('../db/userRepository')(userData);


describe('User Repository', function() {
  describe('Find by username', function() {
    it('should return a user record for <user> if the username <username> is found', function() {
      var username = "test@testing.com";
      var user = userRepository.findByUsername(username, function() {});
    });
  });
});

提前感谢您的帮助

4

3 回答 3

2

您可以将模块声明更改为函数 istead

var userRepository = function(userRecords) {
  //private props

  return {
    //return object
  };

};

然后可以使用您使用的语法调用它 - require(MODULE_NAME)(data)

于 2015-08-25T18:23:29.153 回答
1

userRepository是一个 IIFE,它返回一个对象,所以当你需要它时,你会收到这个对象——唉,它不是一个函数。

我看到您正在尝试调用findByUserName,这确实是该对象上的“公共”函数,只需将您的 require 行更改为以下内容:

userRepository = require('../db/userRepository');

在此行之后,userRepository将是您的 IIFE 返回的对象。然后你可以调用userRepository.findByUserName()(就像你在你的示例中一样),而不需要对你的代码做任何进一步的修改。

如果您想userRepository作为userRecord参数(根据您的评论),请不要使用自调用函数,只需导出当前自调用的函数。

(直观地说:如果你想userRecord从模块外部提供,你不能让这个函数自调用,你需要导出函数本身以使其对你的模块的用户可用——这样他们就可以用userRecord他们有。)

于 2015-08-25T18:24:56.460 回答
1

您的代码当前设置的方式是 exporting userRepository,这实际上等于您的匿名函数的返回值{findByUserName: findByUsername}。这解释了您收到错误的原因Object is not a function

如果你希望你require接受一个参数,它必须是一个函数而不是一个对象。

于 2015-08-25T18:27:51.617 回答