我无法确定/确定将依赖关系传递到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)这将如何影响我未来的单元测试。
对此的任何见解都会很棒!
感谢。
答案 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);
}
这适用于单元测试,因为您可以根据需要提供所需内容,也可以通过更改您需要的文件来存根。
我希望这有帮助!