您好,我在我的节点typescript应用程序中创建了一个自定义错误中间件处理程序
并得到消息不存在于类型ErrorRquestHandler上的错误
const errorHandler = (
err: ErrorRequestHandler,
_req: Request,
res: Response,
_next: NextFunction
) => {
const statusCode = res.statusCode === 200 ? 500 : res.statusCode;
res.status(statusCode);
res.json({
message: err.message,
stack: err.stack
})
}
我尝试在我的tsconfig.json文件中取消注释"typeRoots“和"types”,但仍然出现相同的错误。
是什么导致了这个错误?谢谢
发布于 2021-11-17 15:14:55
看起来您有一个正确声明的错误处理程序,但是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
}
https://stackoverflow.com/questions/70012398
复制相似问题