处理库依赖关系的正确方法

时间:2015-02-19 15:26:41

标签: node.js express

我无法确定/确定将依赖关系传递到Express路由的标准/最佳方法是什么。我遇到的问题是我的一些库有与它们相关的绑定,即。我的会话管理器连接到我的redis队列客户端。我的日志具有相应映射它们的配置设置等。

所以这是我的路线:

// Include routes and endpoints
app.use(require('./routes/account')(queue, models, log));
app.use(require('./routes/message')(queue, models, log));
app.use(require('./routes/admin')  (queue, models, log));

正如您所看到的,我将依赖项作为参数传递。我还没有开始编写我的单元测试,但我怀疑当我到达那里时会带来更多的痛苦。

我想到的另一件事就是将库附加到我的请求对象中:

req.log = log;
req.nconf = nconf;
req.sessions = sessions;

我不确定的是:a)最佳/标准做法是什么,b)这些方法中的任何一种都会影响性能/内存使用,c)这将如何影响我未来的单元测试。

对此的任何见解都会很棒!

感谢。

2 个答案:

答案 0 :(得分:1)

我会在应用级别设置它们:

app.set('queue', queue)

然后将您的应用程序传递给路由功能:

app.use(require ('./routes/admin')(app))

然后检索:

queue = app.get('queue')

答案 1 :(得分:1)

您可能还需要考虑根据需要在文件顶部使用库。

因此,在日志示例中,它将类似于:

var log = require('myLogger');  
// or require('../path/to/logger') if it's your own module

然后你可以继续使用该文件中的日志。

对于模型,只需包含您需要的模型就可以更清晰。 例如:

// messageHandler.js
var Message = require('../models/message');

function sendMessage(params){
   // do some logic on params
   Message.send(params);
}

这适用于单元测试,因为您可以根据需要提供所需内容,也可以通过更改您需要的文件来存根。

我希望这有帮助!