我可以在Express的自定义错误处理程序中访问req(如req.body)吗?

时间:2019-05-02 15:00:12

标签: node.js express

我正在尝试编写一个快速的中间件,在其中记录某些req和res标头并将其写入外部数据库。

部分原因是抛出一个自定义错误处理程序,我可以在其中将err.stack,err.message,req.body,req.params和req.url写入外部文件或应用程序。

我尝试制作自己的错误处理程序,并在app.use()层次结构中最后调用它。在我的路线中,我抛出了一个新错误,在我的自定义错误处理程序中,我尝试记录该错误和req.body。但是,除了错误之外,什么都没有记录。

app.js

app.use(responseTime());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(multilogger({extended: false, development: true, interval: 5000}));
app.use(multiError);

app.use('/', indexRouter);

随机路线

router.post("/", function(req, res, next) {
  return next(new Error("Oh no!"));
});

自定义错误

module.exports = function (err, req, res, next) {
    console.error(err.message); //only this gets logged
    console.error(req.body); // this doesn't appear
    next(err);
};

我想在自定义错误处理程序中分解API调用的req对象,以便可以执行其他操作。

谢谢!

1 个答案:

答案 0 :(得分:0)

之所以遇到这种情况,是因为Express会按照添加到Express的顺序评估所有中间件/路由。调用next()的字面意思是“转到与该请求匹配的下一个可能的处理程序”。在大多数情况下,只有一条路由与请求的URI相匹配,这意味着下一个可能的处理程序将是未指定路由的处理程序。

在Express中,在所有其他中间件/路由之后的之后,您定义了没有路由的默认错误处理程序和404处理程序。 404处理程序应始终是Express App内的最后一条路由。

默认错误处理程序也是一种特殊的中间件,因为它接受4个参数,第一个是错误。检查错误是否已定义很重要,因为如果没有路由匹配,Express将调用默认错误处理程序,因为它没有指定路由。这就是为什么404处理程序始终追随默认错误处理程序的原因,因为它是所有与路由不匹配的请求的全部,并且在这些情况下不会出错。

详细了解Express中的Writing MiddlewareUsing MiddlewareError Handling

const express = require('express')
const bodyParser = require('body-parser')
const PORT = process.env.PORT || 1337

// not sure where this is in your code based on question info
const indexRouter = require('./indexRouter') 

const app = express()

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))

// Your Router
app.use('/', indexRouter)

// Default Error Handler
app.use((err, req, res, next) => {
  // This is necessary to detect any unmatched routes that should be a 404
  if (!err) {
    return next()
  }

  // Handle Error and Respond
})

// 404 Handler, No Route Defined Matched the Requested Route
app.use((req, res) => res.sendStatus(404))

app.listen(PORT, () => console.log(`Listening on ${Port}`))