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

laximzn5  于 2023-11-17  发布在  Go
关注(0)|答案(1)|浏览(221)

我按照这个顺序定义了我的应用程序路由

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是一个自定义错误对象的类,globalErrorError是一个根据来自next()的错误对象发送错误响应的函数。
我的问题是,'*'路由与我以前使用tourRouter处理的所有路由一起运行。我不知道为什么会发生这种情况。它不是这样做的,只是发生了一次,直到我写这个问题的时候仍然发生。
注意事项:Postman从我定义的路由中给了我正确的响应,但是VSC中的终端给了我 “cannot send header after it sent” 错误。
我不知道该怎么办,因为我不知道为什么会发生错误。

yzxexxkh

yzxexxkh1#

我发现了一个错误,那就是我用一个名为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()结束后调用next,这会导致运行堆栈中的下一个中间件,即globalErrorError

app.use(globalErrorHandler);


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

相关问题