传递要求的参数(加载模块时)

是否可以在使用 request 加载模块时传递参数?

我有一个模块 login.js,它提供了登录功能。它需要一个数据库连接,我希望在所有模块中使用相同的数据库连接。现在我导出一个函数 login.setDatabase (...) ,它允许我指定一个数据库连接,这个函数工作得很好。但我宁愿在加载模块时传递数据库和任何其他需求。

var db = ...
var login = require("./login.js")(db);

我对 NodeJS 非常陌生,通常使用 Java 和 Spring 框架开发,所以是的... ... 这是一个构造函数注入:)有可能做类似于我上面提供的代码吗?

129030 次浏览

是的。在 login模块中,只导出一个以 db为参数的函数。例如:

module.exports = function(db) {
...
};

基于你在 这个答案中的评论,我做了你想做的事情:

module.exports = function (app, db) {
var module = {};


module.auth = function (req, res) {
// This will be available 'outside'.
// Authy stuff that can be used outside...
};


// Other stuff...
module.pickle = function(cucumber, herbs, vinegar) {
// This will be available 'outside'.
// Pickling stuff...
};


function jarThemPickles(pickle, jar) {
// This will be NOT available 'outside'.
// Pickling stuff...


return pickleJar;
};


return module;
};

我几乎所有的模块都是这样构建的,看起来对我很有用。

我不确定这是否仍然有用的人,但与 ES6我有一个方法来做,我发现干净和有用的。

class MyClass {
constructor ( arg1, arg2, arg3 )
myFunction1 () {...}
myFunction2 () {...}
myFunction3 () {...}
}


module.exports = ( arg1, arg2, arg3 ) => { return new MyClass( arg1,arg2,arg3 ) }

然后你会得到你想要的行为。

var MyClass = require('/MyClass.js')( arg1, arg2, arg3 )