需要使用显示模块模式的模块

时间:2015-08-25 18:18:33

标签: javascript node.js revealing-module-pattern

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

以下代码是否可行,如果是,我错了?

模块

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;

提前感谢您提供任何帮助

3 个答案:

答案 0 :(得分:2)

您可以将模块声明更改为function isntead

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

  return {
    //return object
  };

};

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

答案 1 :(得分:1)

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

我看到你正试图调用findByUserName,这确实是一个" public"对此对象起作用,只需将您的需求行更改为以下内容:

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

在此行之后,userRepository将成为IIFE返回的对象。然后,您可以在不对代码进行任何进一步修改的情况下调用userRepository.findByUserName()(就像您在样本中一样)。

如果您希望userRepositoryuserRecord作为参数(根据您的评论),请不要使用自助调用功能,只需导出当前的功能自调用。

(直观地说:如果您希望从模块外部提供userRecord,则无法自行调用此函数,您需要导出函数本身以使其可用于模块的用户 - 以便他们可以使用他们拥有的userRecord来调用它。)

答案 2 :(得分:1)

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

的原因

如果您希望require接受参数,则必须是函数而不是对象。