Javascript Express.js:调用内部服务
我对node.js、express.js和restapi有些陌生 这是我的问题: 我需要在多种情况下从我的数据库(mongoDB,如果相关的话)加载用户信息 在这种情况下,最佳做法是什么 1) 直接从数据库加载: index.js:Javascript Express.js:调用内部服务,javascript,node.js,mongodb,rest,express,Javascript,Node.js,Mongodb,Rest,Express,我对node.js、express.js和restapi有些陌生 这是我的问题: 我需要在多种情况下从我的数据库(mongoDB,如果相关的话)加载用户信息 在这种情况下,最佳做法是什么 1) 直接从数据库加载: index.js: db.collection('usercollection').findOne({email: req.user.email}, function(err, result){... 2) 从另一个从数据库读取的路由调用服务: users.js: /* GET u
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:
db.collection('usercollection').findOne({email: req.user.email}, function(err, result){...
//呼叫用户/email/emailParameterURL
3) 这两个都没有
感谢您抽出时间让我们说,如果您想获得api的授权访问权限,在第一种情况下您不能做任何事情。若您不知道增强安全性的访问,第一种情况可以工作,但若您想要对api进行更多控制,请使用第二种情况。我所说的控制是指对数据的操作,也许你有一些散列值等等…我个人尽量将我的应用程序逻辑与Express routes分开 因此,我创建了自己的控制器模块(或者随意称呼它们),它们接收数据库和配置变量(如果需要,允许稍后交换,或者模拟以进行测试) 在路由中,我使用这些控制器类,将它们传递给数据库 这使我能够快速、干净地单元测试我的核心逻辑,而不必处理express。否则,最终只能对路由进行集成测试 它还允许您在不中断应用程序的情况下,在以后轻松更改路由 而且,我推荐的还不够。这些让我大大简化了事情,并避免了大量的回调地狱 一个很小的例子:
/// 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);
});
});
谢谢你明确的回答。我还认为这样应用程序会更干净。我一定会试试蓝鸟的。不客气。PS:我刚刚修复了代码中的一个小错误,但基本概念是一样的。