NodeJS 为什么在express js中发送响应后会调用全局错误处理中间件

kfgdxczn  于 9个月前  发布在  Node.js
关注(0)|答案(2)|浏览(96)

为什么执行到达全局错误处理程序,err的值是404,因为我从/test路由发送res,req-res周期应该结束,它没有抛出错误作为响应,但它将404记录到控制台。

app.get('/test', (req, res, next) => {
  console.log('mw 1');
  res.send('hello');
});

// if none of the above routes matched
app.all('*', (req, res, next) => {
  next(404, `${req.originalUrl} not found`);
});

// Global error Handling
app.use((err, req, res, next) => {
  console.log('global error handler: ', err);
  res.status(500).json({
    status: '❌ error',
    message: err.message || 'Internal Server Error',
  });
});

字符串
输出:mw 1全局错误处理程序:404

yvfmudvl

yvfmudvl1#

我猜你会看到两个独立的传入请求,一个来自你请求的页面,另一个是浏览器为/favicon.ico添加的请求。
修改你的错误处理器,输出请求路径如下:

app.use((err, req, res, next) => {
  console.log(`global error on ${req.originalUrl}`);
  console.log('global error handler: ', err);
  res.status(500).json({
    status: '❌ error',
    message: err.message || 'Internal Server Error',
  });
});

字符串
输出与错误关联的URL。
或者,只需添加此中间件作为第一个请求处理程序:

app.use((req, res, next) => {
    console.log(`incoming request: ${req.originalUrl}`);
    next();
});


你可以看到每一个请求。
另外,请注意next()接受零个或一个参数。它不像你这样接受两个参数。如果你想传递多个值,那么next的参数可以是一个具有多个属性的对象(通常是Error对象)。

a1o7rhls

a1o7rhls2#

在处理所有未定义路由的中间件中,您向下一个传递两个值,第一个值是404。

next(404, `${req.originalUrl} not found`);

字符串
next只接受一个值。如果next不带任何参数被调用,那么堆栈中的下一个中间件将被调用,否则它将由全局错误处理中间件处理。
试着修改一下:

// if none of the above routes matched
app.all('*', (req, res, next) => {
  const err = {
    statusCode: 404, 
    message: `${req.originalUrl} not found`
  }

  next(err);
});

相关问题