Javascript Express.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

我对node.js、express.js和restapi有些陌生

这是我的问题:

我需要在多种情况下从我的数据库(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:

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:我刚刚修复了代码中的一个小错误,但基本概念是一样的。