首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >类型'ErrorRequestHandler<ParamsDictionary,any,any,ParsedQs,Record<string,any>‘.ts(2339)上不存在属性'message’?

类型'ErrorRequestHandler<ParamsDictionary,any,any,ParsedQs,Record<string,any>‘.ts(2339)上不存在属性'message’?
EN

Stack Overflow用户
提问于 2021-11-17 22:30:42
回答 1查看 22关注 0票数 0

您好,我在我的节点typescript应用程序中创建了一个自定义错误中间件处理程序

并得到消息不存在于类型ErrorRquestHandler上的错误

代码语言:javascript
复制
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”,但仍然出现相同的错误。

是什么导致了这个错误?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-17 23:14:55

看起来您有一个正确声明的错误处理程序,但是err参数的类型是错误的,相反,const errorHandler本身应该使用ErrorRequestHandler类型,以便推断参数。

类型ErrorRequestHandlerdefined as follows in DefinitelyTyped

代码语言:javascript
复制
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;

建议您的代码应如下所示:

代码语言:javascript
复制
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显式地测试错误。

代码语言:javascript
复制
if (isNativeError(err)) {
  // use err.message
} else {
  // handle unexpected error
  // or send generic unknown error response
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70012398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档