Express 4.x自定义404错误处理中间件未触发返回默认Cannot GET问题咨询
问题根源
你定义的两个携带err参数的中间件属于Express的全局错误捕获中间件,仅当之前的路由/中间件主动调用next(err)抛出错误时才会触发。访问不存在的路径时,属于未匹配到任何路由的正常请求流,没有抛出任何错误,因此不会进入这类4参数的错误中间件,最终返回Express默认的404提示。
正确配置方案
需要先添加无err参数的404捕获中间件,放在所有业务路由之后、全局错误处理中间件之前,配置顺序如下:
// 1. 先放所有业务路由 app.use("/login", login); // 2. 再放404捕获中间件:匹配所有未命中前面路由的请求 // 方式一:直接在该中间件返回404响应 app.use("*", (req: Request, res: Response) => { res.status(404).send('ERRORRRRR4040404040404 ******') }) // 方式二:主动将404转为错误,抛给后面的全局错误处理中间件统一处理 // app.use("*", (req: Request, res: Response, next: NextFunction) => { // const notFoundError = new Error('路径不存在') // notFoundError.status = 404 // next(notFoundError) // }) // 3. 最后放全局错误处理中间件:统一捕获所有主动抛出的错误 app.use((err: any, req: Request, res: Response, next: NextFunction) => { console.log('捕获错误:', err) const statusCode = err.status || 500 res.status(statusCode).send(statusCode === 404 ? 'ERRORRRRR4040404040404' : '服务端内部错误') }); app.listen(config.port, () => { console.log(`Running at port ${config.port}`); });
注意事项
- 中间件的执行顺序严格按照注册顺序执行,绝对不能调换业务路由、404中间件、全局错误处理中间件的位置
- 全局错误处理中间件必须保留4个参数,即使你不需要用到
next也不能省略,否则Express不会把它识别为错误处理中间件
内容的提问来源于stack exchange,提问作者chichi
相关产品推荐
相关产品推荐

