2012-10-31 23 views
77

使用require加载模块时是否可以传递参数?传递参数要求(当加载模块时)

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

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

我与漂亮的NodeJS新的发展,通常使用Java和Spring框架,所以是......这是一个构造函数注入:)是否有可能做一些像我上面提供的代码?

+0

我还建议看看[这个](http://stackoverflow.com/questions/13080771/node-js-passing-variables)问题的答案。正如在我的回答中指出的那样,一个常见的习惯用法是将'app'对象传递给所需的模块。 –

+0

您可以使用[singleton](http://www.dofactory.com/javascript/singleton-design-pattern)实现并在需要时调用db.getInstance(),而不是执行所有为db传递的参数。 – wulfgarpro

回答

168

基于对this answer您的意见,我做你想要做这样的:

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

我结构几乎我所有的模块,这样。似乎对我很好。

+0

不错。我真的不知道我应该接受哪个答案:)这对我来说和上面的其他答案一样有效......谢谢。 –

+66

对我无所谓 - 我只是很高兴我终于在StackOverflow上谈论泡菜。 :P – floatingLomas

+2

这应该被标记为正确的答案 –

27

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

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

我试过了。 在login.js 'module.exports =函数(应用程序,分贝){ ... } module.exports.auth =函数(REQ,RES){ ...认证东西 }' 它确实调用了“匿名”函数并设置了“app”和“db”变量,但是当这样做时,我的应用程序将找不到'auth'函数。我究竟做错了什么?如果我删除了匿名函数,那么'auth'函数就可以再次访问。 –

+0

与javascript中的所有内容一样,'exports'是一个对象。您可以为其分配属性(多个导出),也可以将其分配给一个值。这听起来像您已将输出分配给函数,但随后将auth分配为您分配给输出的函数的属性。所以你需要做'var auth = require(“./ login.js”)。auth'这可能不是你想要的。如果您想使用原始问题中的模式,则可能最好坚持一个出口值。如果这仍然没有意义,我建议张贴一个要点让我看看。 –

+1

再次读完这个之后,听起来您可能已经将'auth'分配为'exports'对象的一个​​属性,然后在模块中将'exports'分配给一个函数(因此覆盖之前的赋值)。如果您颠倒赋值顺序,您应该可以像预期的那样访问'auth'函数。再次,如果没有真正看到代码,很难说清楚。 –

-1

另一种方式去了解的东西先定义方法,然后让他们通过“出口”下面提供。(module.exports和出口指向同一个对象)

function kamehameha(name,fame){ 


} 

function bigbangkamehameha(name){ 

} 



exports.kamehameha=kamehameha; 
exports.bigbang=bigbangkamehameha; //bigbang refers to bigbangkamehameha 
9

我不知道如果这仍然对人们有用,但对于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)