133

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

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

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

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

4

3 回答 3

250

根据您在此答案中的评论,我会做您想做的事情:

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;
};

我几乎所有的模块都是这样构建的。似乎对我很有效。

于 2012-10-31T17:00:12.797 回答
50

我不确定这是否仍然对人们有用,但是使用 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 )
于 2017-04-14T20:03:25.390 回答
33

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

module.exports = function(db) {
  ...
};
于 2012-10-31T05:22:58.150 回答