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

TypeScript Express自定义错误处理报错及@types安装问题求助

问题分析与解决方法

一、404中间件类型报错问题

问题原因

  1. 你将错误处理中间件(接收err, req, res, next四个参数)放在了路由定义之前,Express会把它识别为普通中间件,但普通中间件只接受3个参数,导致类型不匹配。
  2. 404路由未匹配的场景不需要使用错误处理中间件——错误处理中间件的作用是捕获路由处理过程中抛出的异常,而404是所有路由都未匹配到的情况,应该用普通中间件处理。

解决方法

步骤1:修改404中间件为普通中间件

更新./middleware/not-found.ts:

import express, { Request, Response, NextFunction } from 'express'

// 普通中间件,无需err参数
const notFoundErrorHandler = (req: Request, res: Response, next: NextFunction) => {
  res.status(404).send('Route does not exist')
}

export default notFoundErrorHandler

步骤2:调整中间件挂载顺序

更新app.ts,确保404中间件在所有路由之后挂载,同时改用ES模块规范导入:

import express from 'express'
import 'express-async-errors'
const app = express()

// ES模块导入方式
import notFoundErrorHandler from './middleware/not-found'

// 先定义所有业务路由
app.get('/hi', (req, res) => {
  res.send('HIIIIIIII')
})

// 最后挂载404中间件
app.use(notFoundErrorHandler)

app.listen(process.env.PORT, () => {
  console.log(`app is listening on port ${process.env.PORT}`)
})

如果需要保留错误处理中间件(用于捕获异步路由抛出的错误),请确保它也放在所有路由和普通中间件之后:

// 错误处理中间件(必须4个参数),放在最末尾
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
  console.error(err.stack)
  res.status(500).send('Server Internal Error')
})

二、@types/express-async-errors安装失败问题

问题原因

express-async-errors本身是用TypeScript编写的,包内已经自带了类型定义文件,npm官方仓库不存在独立的@types/express-async-errors包,因此安装时会返回404。

解决方法

直接安装express-async-errors即可,无需额外安装@types包:

npm i express-async-errors

内容的提问来源于stack exchange,提问作者gerard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:53:15