javascript 为什么在express中调用next()之后底层代码仍然在块中执行?

ruoxqz4g  于 2023-01-07  发布在  Java
关注(0)|答案(3)|浏览(153)
exports.getTour = catchAsync(async (req, res, next) => {
  const tour = await Tour.findById(req.params.id);

  if (!tour) {
    next(new AppError('No tour found with that ID', 404));
  }

  res.status(200).json({
    status: 'success',
    data: {
      tour
    }
  });
});

如果tour变量为空,我调用next()方法并使用类构造函数在其中创建错误,但即使在调用next()之后,响应也作为请求的响应发送,然后我收到'[ERR_HTTP_HEADERS_SENT]:'错误。为什么即使在调用next之后,块也没有退出?

yx2lnoni

yx2lnoni1#

因为如果tour为空,则需要return来中断函数。
所以这样做

if (!tour) {
  return next(new AppError('No tour found with that ID', 404));  
}
bkhjykvo

bkhjykvo2#

next()将当前回调函数传递给具有相同URL的下一个请求。如果未在回调函数中激活响应,则无法完成请求。要完成回调函数,应使用任何函数编写响应。要在回调时使用next(),应存在另一个请求,例如

// request to be passed by `next()`
app.request('same URL', (res, req) => {

...

res.end()

});

这是一个关于next()的快速文档示例。
如果您想结束发送错误,那么只需使用JSON res.status(404).send("error": "No tour found with that ID")进行响应。

lndjwyie

lndjwyie3#

在中间件中,您应该执行next()函数,尝试

module.exports.getTour = async (req, res, next) => {
  const tour = await Tour.findById(req.params.id);
  if (!tour) res.send("No tour found with that ID");

  req.tour = tour;

  next();
};

相关问题