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使用第二个。 通过控制我的意思是操纵数据,也许你有一些哈希值等等…