【问题标题】:Property 'message' does not exist on type 'ErrorRequestHandler<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.ts(2339)?类型“ErrorRequestHandler<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.ts(2339) 上不存在属性“消息”?
【发布时间】:2021-12-28 21:40:38
【问题描述】:

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

并收到错误消息,类型 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”,但仍然出现同样的错误。

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

【问题讨论】:

    标签: node.js typescript express


    【解决方案1】:

    看起来您有一个正确声明的错误处理程序,但 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
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2021-08-08
      • 1970-01-01
      • 2021-02-08
      • 2021-01-13
      相关资源
      最近更新 更多