ExpressJS中间件组合

时间:2015-06-03 12:30:18

标签: express middleware

我正在开发一个具有非常简单的端点的项目:

app.get('/transactions', 
    listTransactions(connectionPool), 
    addUser(connectionPool), 
    sendTransactions);

我们获取MySQL行列表,将用户数据合并到响应中,然后将其发送回用户。我的问题是,是否存在“普遍接受”的地方来存储listTransactions(在这种情况下)的回复?我是否将其存储在req对象上?

1 个答案:

答案 0 :(得分:0)

这是我的看法。我认为你在这种情况下滥用中间件。中间件在解码,验证等方面更胜一筹。我认为你的例子已经达到了将这些东西包装在这样的函数中会很有意义的地步。

app.get('/transactions', function(req, res, next){
    var transactionPromise = listTransactions(connectionPool)
      .then(function(transactions){
        return listTransactions(transactions, connectionPool);
      })
      .then(function(listedTransactions){
        return addUser(connectionPool);
      })
      .then(function(addUserResponse){
        res.send(addUserResponse);
      });

    transactionPromise.catch(function(error){
      res.status(500).send("Something went wrong: " + error.toString());
    }
}

我在这里使用promises,但这也很容易用async之类的东西来完成。这种方法做了一些事情:

  1. 允许您在路由器级别处理错误,而不是在每个函数内部处理错误。如果您考虑一下,那么名为listTransactions的函数是否真的知道如何响应服务器请求?

  2. 结合第一点,它可以通过消除对(req, res, next)签名的依赖来实现更好的可重用性。

  3. 可测试性。现在,您可以测试所有单个部分,而无需依赖以前的中间件或特定的req格式。

  4. 我的2¢。希望它有所帮助!