提问人:omarElsayed Muhammad 提问时间:10/15/2023 最后编辑:Mark RotteveelomarElsayed Muhammad 更新时间:10/17/2023 访问量:28
如何防止“*”路由与之前定义的路由一起运行
How to prevent "*" route from running with the routes defined previously
问:
我按此顺序定义了我的应用路由
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 中的终端给了我“发送后无法发送标头”错误。
我不知道该怎么办,因为我不知道为什么会发生错误。
答:
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);
运行并发送另一个响应,然后从这里发生错误 但让我仍然感到困惑的是,代码运行良好,然后开始抛出错误
评论