我正在尝试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;
提前感谢您提供任何帮助
答案 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()
(就像您在样本中一样)。
如果您希望userRepository
将userRecord
作为参数(根据您的评论),请不要使用自助调用功能,只需导出当前的功能自调用。
(直观地说:如果您希望从模块外部提供userRecord
,则无法自行调用此函数,您需要导出函数本身以使其可用于模块的用户 - 以便他们可以使用他们拥有的userRecord
来调用它。)
答案 2 :(得分:1)
当前设置代码的方式是导出userRepository
,它实际上等于匿名函数{findByUserName: findByUsername}
的返回值。这解释了您收到错误Object is not a function
。
如果您希望require
接受参数,则必须是函数而不是对象。