如何防止“*”路由与之前定义的路由一起运行

How to prevent "*" route from running with the routes defined previously

提问人:omarElsayed Muhammad 提问时间:10/15/2023 最后编辑:Mark RotteveelomarElsayed Muhammad 更新时间:10/17/2023 访问量:28

问:

我按此顺序定义了我的应用路由

app.use(express.json());
app.use(express.static(`${__dirname}/public`));
app.use('/api/v1/tours', tourRouter);
app.use('/api/v1/users', userRouter);

app.all('*', (req, res, next) => {
  const error = new AppError(
    `This ${req.originalUrl} is not on the server`,
    404,
  );
  next(error);
});

app.use(globalErrorHandler);

AppError 是用于自定义错误对象的类,globalErrorHandler 是根据错误对象的来源发送错误响应的函数。next()

我的问题是“*”路由与我之前使用 tourRouter 处理的所有路由一起运行。我不知道为什么会这样。它没有这样做,只是发生一次,直到我写这个问题时仍然发生。

注意:Postman 从我定义的路由中给了我正确的响应,但 VSC 中的终端给了我“发送后无法发送标头”错误。

我不知道该怎么办,因为我不知道为什么会发生错误。

JavaScript 节点.js MongoDB 错误处理 后端

评论

1赞 Konrad 10/15/2023
您确定此代码正在运行吗?提示其他内容的错误。我猜路由尝试发送数据两次
0赞 omarElsayed Muhammad 10/15/2023
代码按预期运行,但是每次请求后终端中都会显示一个错误,如果您的猜测是正确的,如何解决它,因为我只是在每个处理程序中都有res.status().json()

答:

0赞 omarElsayed Muhammad 10/17/2023 #1

我发现了一个错误,那就是我用一个名为 catchAsync() 的函数对异步路由器处理程序函数进行了攻击

module.exports = function (fn) {
  return (req, res, next) => {
    fn(req, res, next).then(next);
  }
}

我已将此功能更新为此

module.exports = function (fn) {
  return (req, res, next) => {
    try {
      fn(req, res, next);
    } catch (error) {
      next(error);
    }
  };
};

我这样做是因为 catchAsync 函数在 fn() 结束后调用下一个中间件,这会导致在堆栈中运行下一个中间件,即 globalErrorHandler

app.use(globalErrorHandler);

运行并发送另一个响应,然后从这里发生错误 但让我仍然感到困惑的是,代码运行良好,然后开始抛出错误