ExpressJS 中间件组成

ExpressJS Middleware Composition

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

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

我们得到 MySQL 行的列表,将用户数据合并到响应中,并将其发回给用户。我的问题是,是否有一个 "commonly accepted" 的地方来存储 listTransactions 的响应(在这种情况下)?我是否将其存储在 req 对象上?

这是我的看法。我认为你在这种情况下滥用中间件。中间件在解码、验证等方面做得更好。我认为您的示例已经达到了将这些东西包装在像这样的函数中很有意义的地步。

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 格式。

我的 2¢。希望对您有所帮助!