我对 node.js、express.js 和 REST API 有点陌生。
这是我的问题:
在多种情况下,我需要从我的数据库(如果相关的话是 mongoDB)加载用户信息。
这种情况下的最佳做法是什么?
1)直接从数据库加载:
索引.js:
db.collection('usercollection').findOne({email: req.user.email}, function(err, result){...
2) 从另一个从数据库读取的路由调用服务:
用户.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);
});
});
索引.js:
//调用users/email/emailParameterURL
3) 这两个都不是?
谢谢你的时间
最佳答案
就我个人而言,我尽量将我的应用程序逻辑与 Express 路由分开。
因此,我创建了自己的 Controller 模块(或随意调用它们),它们接收数据库和配置变量(允许稍后在需要时换出,或模拟测试)。
在路由中,我使用这些 Controller 类,将它们传递给数据库。
这使我能够快速、干净地对我的核心逻辑进行单元测试,而无需处理 express。否则,最终只能对路由进行集成测试。
它还允许您稍后轻松更改路线,而不会破坏您的应用程序。
另外,我不推荐Bluebird promises足够的。这些让我大大简化了事情,避免了很多回调 hell 。
一个小例子:
/// 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);
});
});
关于javascript - express .js : calling internal services,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25609893/