You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:36:01