关于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:
//呼叫用户/ email / emailParameterURL
3)这两个都没有?
感谢您的时间
答案 0 :(得分:3)
就个人而言,我尝试将我的应用程序逻辑尽可能与Express路由分开。
因此,我创建了自己的控制器模块(或者按照你的意愿调用它们),这些模块接收数据库和配置变量(如果需要,允许稍后交换,或者模拟测试)。
在路由中,我使用这些控制器类,将它们传递给数据库。
这使我能够快速而干净地对我的核心逻辑进行单元测试,而无需处理快递。否则,最终只能在路线上进行集成测试。
它还允许您以后轻松更改路线,而不会破坏您的应用程序。
另外,我不能推荐Bluebird promises。这些让我大大简化了事情,避免了很多回调地狱。
一个小例子:
/// 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);
});
});
答案 1 :(得分:0)
如果想要获得授权访问您的api,您可以在第一种情况下无法执行任何操作。如果您没有安全增强访问,则第一种情况可以起作用,但如果您想要更多地控制您的api,请使用第二种情况。通过控制我的意思是操纵数据,也许你有一些散列值等等......