将参数传递给require(加载模块时)

And*_*all 107 node.js express

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

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

var db = ...
var login = require("./login.js")(db);
Run Code Online (Sandbox Code Playgroud)

我是NodeJS的新手,通常使用Java和Spring Framework开发,所以是的...这是一个构造函数注入:)是否有可能像我上面提供的代码那样做?

flo*_*mas 220

根据您在此答案中的评论,我会按照以下方式执行您要执行的操作:

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;
};
Run Code Online (Sandbox Code Playgroud)

我构建了几乎所有我的模块.似乎对我有用.

  • @TomH在这种情况下,你想要缓存它.要做到这一点,你需要`var module;`在exports函数之外,然后一旦你进入你想要检查`module`是否已经定义,如果是,那么只需返回它(如果不,初始化它).那有意义吗? (2认同)

Dav*_*don 30

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

module.exports = function(db) {
  ...
};
Run Code Online (Sandbox Code Playgroud)


lia*_*ovk 30

我不确定这对人们是否仍然有用,但是对于ES6,我有办法做到这一点,我发现它很干净,很有用.

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

module.exports = ( arg1, arg2, arg3 ) => { return new MyClass( arg1,arg2,arg3 ) }
Run Code Online (Sandbox Code Playgroud)

然后你得到了你预期的行为.

var MyClass = require('/MyClass.js')( arg1, arg2, arg3 )
Run Code Online (Sandbox Code Playgroud)