TypeScript Express自定义错误处理报错及@types安装问题求助
问题分析与解决方法
一、404中间件类型报错问题
问题原因
- 你将错误处理中间件(接收
err, req, res, next四个参数)放在了路由定义之前,Express会把它识别为普通中间件,但普通中间件只接受3个参数,导致类型不匹配。 - 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
相关产品推荐
相关产品推荐

