【问题标题】:ExpressJS Middleware CompositionExpressJS 中间件组合
【发布时间】:2015-06-03 12:30:18
【问题描述】:

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

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

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

【问题讨论】:

  • 我倾向于使用res.locals,尽管它确实会显示在视图中(在大多数情况下这不是问题)。

标签: express middleware


【解决方案1】:

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

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());
    }
}

我在这里使用 Promise,但这也可以通过 async 之类的方式轻松完成。这种方法做了一些事情:

  1. 允许您在路由器级别而不是在每个函数内部处理错误。仔细想想,一个叫listTransactions的函数真的应该知道如何响应服务器请求吗?

  2. 结合第一点,通过去除对(req, res, next)签名的依赖,实现了更好的复用性。

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

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

【讨论】:

  • 是的,这就是我最初的想法(使用 lodash / Ramda 和链接,或者,正如你所建议的,Promises),但我认为通过使用中间件,对于任何熟悉的开发人员来说,这将更容易进入继承此项目时使用 ExpressJS。
  • 有趣。为什么你认为这种方法会更难理解?在我看来,只需使用常规的旧函数,您几乎不需要对 Express 有任何了解。
猜你喜欢
  • 1970-01-01
  • 2023-01-21
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 2018-01-27
  • 2013-12-05
相关资源
最近更新 更多