Express.js:调用内部服务

时间:2014-09-01 16:29:36

标签: javascript node.js mongodb rest express

关于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)这两个都没有?

感谢您的时间

2 个答案:

答案 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,请使用第二种情况。通过控制我的意思是操纵数据,也许你有一些散列值等等......