【问题标题】:Express.js : calling internal servicesExpress.js : 调用内部服务
【发布时间】:2014-09-01 16:29:36
【问题描述】:

我对 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) 这两个都不是?

感谢您的宝贵时间

【问题讨论】:

    标签: javascript node.js mongodb rest express


    【解决方案1】:

    就我个人而言,我尽量让我的应用程序逻辑与 Express 路由分开。

    所以,我创建了我自己的控制器模块(或者你想怎么称呼它们),它接收数据库和配置变量(允许稍后根据需要换出,或模拟测试)。

    在路由中,我使用这些控制器类,将它们传递给数据库。

    这使我能够快速、干净地对我的核心逻辑进行单元测试,而无需处理 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);
        });
    });
    

    【讨论】:

    • 感谢您的明确答复。我也认为这样应用程序会更干净。我一定会试试 Bluebird。
    • 不客气。 PS:我只是修正了代码中的一个小错字,但基本概念是一样的。
    【解决方案2】:

    可以说,如果想要获得对您的 api 的授权访问,则在第一种情况下您不能做任何事情。如果您不安全增强访问第一种情况可以工作,但如果您想更多地控制您的 api,请使用第二种情况。控制是指对数据的操作,也许你有一些散列值等等......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 2012-08-06
      • 2018-03-03
      • 1970-01-01
      • 2020-05-09
      • 2020-04-24
      相关资源
      最近更新 更多