看起来您有一个正确声明的错误处理程序,但 err 参数的类型是错误的,相反,const errorHandler 本身应该使用 ErrorRequestHandler 键入,以便推断参数。
ErrorRequestHandler 的类型是defined as follows in DefinitelyTyped:
export type ErrorRequestHandler<
P = ParamsDictionary,
ResBody = any,
ReqBody = any,
ReqQuery = ParsedQs,
Locals extends Record<string, any> = Record<string, any>
> = (
err: any,
req: Request<P, ResBody, ReqBody, ReqQuery, Locals>,
res: Response<ResBody, Locals>,
next: NextFunction,
) => void;
建议您的代码应如下所示:
const errorHandler: ErrorRequestHandler = (
err,
_req,
res,
_next
) => {
const statusCode = res.statusCode === 200 ? 500 : res.statusCode;
res.status(statusCode);
res.json({
message: err.message,
stack: err.stack
})
}
请注意,将 const errorHandler 更改为使用 ErrorRequestHandler 键入意味着您可以删除函数上显式键入的参数(除非您启用了需要它们的 tsconfig 选项)。请注意,由于ErrorRequestHandler,现在err 被键入为err: any,您可能应该在使用err.message 之前先对其进行测试以确保它是一个错误,因为它也不能保证是Error 的类型。但是编译器会允许它,因为它的类型为any,为了安全起见,我建议您在使用属性之前使用built-in node utility api 明确测试错误。
if (isNativeError(err)) {
// use err.message
} else {
// handle unexpected error
// or send generic unknown error response
}