TypeError: res.status 不是错误处理中间件中的函数

问题描述

我只想添加一个最小的中间件来处理我的 express typescript 项目中的错误
我使用来自庆祝的错误方法让它处理庆祝/joi 错误,并想添加一个来处理其他错误
这是我的代码

app.use(errors()); // celebration error handling
app.use((err: any,req: Request,res: Response) => res.status(300).json(err.message));

为了测试它,我尝试向不存在的端点发送 GET,但我不断收到此错误TypeError: res.status is not a function

我应该怎么做才能像我想要的那样使用请求?

解决方法

如果你想写error handling middleware,你必须提供一个带有四个声明参数的函数,而不仅仅是三个。所以在你的情况下:

app.use((err: any,req: Request,res: Response,next: NextFunction) => res.status(300).json(err.message));

即使您没有在代码中使用 next 函数,Express 也只能告诉它是一个错误处理程序中间件函数,如果它需要四个形参。来自上面链接的文档:

错误处理中间件总是采用四个参数。您必须提供四个参数以将其标识为错误处理中间件函数。即使不需要使用 next 对象,也必须指定它来维护签名。否则,下一个对象将被解释为常规中间件并且无法处理错误。

Express 必须查看函数的 length property 才能知道它是否是错误处理中间件。