【问题标题】:Express middleware: res.statusCode doesn't accurately return the status code [duplicate]Express 中间件:res.statusCode 无法准确返回状态码 [重复]
【发布时间】:2020-05-21 21:24:20
【问题描述】:

我在 Express JS 应用程序中有一个相当简单的日志中间件功能:

app.use(function (req, res, next) {
  const line = `${req.method} ${req.originalUrl} ${res.statusCode}`
  console.log(line)
  next()
})

我有这条路线:

this.app.use('/404', function (req, res) {
  res.sendStatus(404)
})

记录以下内容:

GET /404 200

对于其他路线,它似乎总是返回 200。

我该如何解决这个问题,以便在不更改路线的情况下准确记录状态代码?

编辑

我的目标是快速告诉我一条路线是否被击中以及它是否成功。我不想编辑我的所有路由以兼容它,因为我最终会用实际的日志记录解决方案替换它。

【问题讨论】:

    标签: javascript node.js express http middleware


    【解决方案1】:

    取决于:https://expressjs.com/guide/error-handling.html

    app.use('/404', function (req, res) {
      console.error(err.stack);
      res.status(404).send('not found!');
    });
    

    你也可以使用http-errors模块:

    var createError = require('http-errors');
    
    app.use(function(req, res, next) {
      next(createError(404));
    });
    

    【讨论】:

      【解决方案2】:

      这仍然不适用于所有路线,但适用于更多路线:

      this.app.use(async function (req, res, next) {
        await next()
        const line = `${req.method} ${req.originalUrl} ${res.statusCode}`
        console.log(line)
      })
      

      【讨论】:

      • 请注意,等待next() 是没有用的,因为它总是返回 undefined 而不是 Promise。 await 将直接进入下一行而无需等待。您已经设法让某些东西意外地工作了,但是如果您的任何中间件或路由中有异步代码(承诺或回调),您的记录器将再次失败。 Express 的设计并不是为了支持您的用例。如果你真的需要运行一个中间件,你需要在所有路由中调用next()stackoverflow.com/questions/24258782/…
      • 奇怪的是,它适用于更多带有 await 的路线,但你是对的,它并没有涵盖所有路线。项目中所有路由都使用async/await。
      • 那是因为await的设计。它只会在给定一个 Promise 时等待,但如果你给它其他任何东西,它就会默默地继续。这样一来,如果需要,函数可以选择返回真实值而不是承诺,因此您无需将返回值包装在冗余的 Promise.resolve() 中。不是没用,只是没用
      【解决方案3】:

      不知道您的整个代码,但 this.app 不是必需的。直接使用 app.use。 调试,在点击时,您要求不要进入 app.use('/404'),它可能是上面提到的服务路径,如 app.use('/:variable'),所以可能是变量 == 404。 在最上面提到这种类型的静态路径。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-13
        相关资源
        最近更新 更多