Express.js:调用内部服务

我对node.js,express.js和REST API有点新。

这是我的问题:

我需要从我的数据库(mongoDB,如果相关的话)加载用户信息在多个情况下。

这种情况下的最佳做法是什么?

1)直接从数据库中加载:

index.js:

db.collection('usercollection').findOne({email: req.user.email}, function(err, result){... 

2)从另一个从数据库读取的路由调用服务:

users.js:

 /* GET user by email */ router.get('/:email', function(req, res) { var db = req.db; var email = req.params.email; db.collection('usercollection').findOne({email: email}, function(err, result) { if (err) throw err; res.json(result); }); }); 

index.js:

//呼叫用户/电子邮件/ emailParameterURL

3)这两个都没有?

谢谢你的时间

我个人尽量保持我的应用程序逻辑与Express路线分开。

所以,我创build了我自己的控制器模块(或者调用它们),它接收数据库和configurationvariables(如果需要,可以稍后调换,或者模拟testing)。

在路由中,我使用这些控制器类,将它们传递给数据库。

这使我能够快速,干净地unit testing我的核心逻辑,而不必处理快递。 否则,最终只能对路由进行集成testing。

它也可以让你稍后改变你的路线,而不会中断你的申请。

另外,我不能推荐蓝鸟足够的承诺 。 这些让我大大简化了事情,避免了很多回拨地狱。

一个小例子:

 /// usercontroller.js var UserController = { _database: null, setDatabase: function(db) { this._database = db; }, findUserByEmail: function(email, callback) { this._database.collection('usercollection').findOne({email: req.user.email}, callback); } }; module.exports = UserController; /// routes.js /* GET user by email */ router.get('/:email', function(req, res) { var UserController = require('./usercontroller'); var db = req.db; UserController.setDB(db); UserController.findUserByEmail(req.params.email, function(err, result) { if (err) throw err; res.json(result); }); }); 

可以说如果想要授权访问你的api你不能在第一种情况下做任何事情。 如果你不安全增强访问第一种情况可以工作,但如果你想更多的控制你的API使用第二个。 通过控制我的意思是操纵数据,也许你有一些哈希值等等…