【问题标题】:how to extend Request type in Express with custom property如何使用自定义属性在 Express 中扩展请求类型
【发布时间】:2021-04-08 12:46:32
【问题描述】:

我正在尝试使用 typescript 在 Node.js 中设置自定义中间件函数,我想在其中将解码的 json Web 令牌存储到自定义请求属性“用户”中,就像这样

  function auth(req: Request, res: Response, next: NextFunction) {

     const decodedToken = jwt.verify(token, config.get("secret"));

     req.user = decodedToken.user; 
     next();
  }

但我在终端中不断收到编译器错误

错误 TS2339:“请求”类型上不存在属性“用户”。

我在这里找到了几个建议创建 custom.d.ts 文件并扩展我这样做的请求类型的答案:

namespace Express {
  interface Request {
    user?: string;
  }
}

现在,VS Code 很高兴,我没有 linting,我得到了正确的智能感知和自动完成,它不允许我分配一个数字,因为它知道它需要是一个字符串。所以它显然有效。但是,当我运行代码时,终端一直给我同样的错误,并坚持认为属性“用户”不存在。

我尝试重新启动 TS 服务器,但没有帮助。

我可以通过创建一个扩展 Request 类型的自定义接口然后使用它来使其工作,但我真的想知道如何使用原始 Request 类型来做到这一点。

【问题讨论】:

    标签: node.js typescript express


    【解决方案1】:

    经过大量的谷歌搜索和使用文件夹结构和 tsconfig.json 文件后,我设法使它工作。我将custom.d.ts 文件放在./@types/express 中(子文件夹必须在那里)并在 tsconfig.json 中设置 typeRoots,如下所示:

    compilerOptions: {
      "typeRoots": ["./@types"],
    }
    

    我还必须在 custom.d.ts 中声明命名空间

    declare namespace Express {
      interface Request {
        user: any;
      }
    }
    

    现在编译没有错误

    【讨论】:

      【解决方案2】:

      无法使用 typescript 对原始对象执行此操作 - 它来自 Express,而您正在从 Express 导入它。你能做的最好的事情就是像你一样扩展它,或者忽略错误。

      理论上你绝对可以做到这一点——你可以在中间件的req对象中添加任何你想要的东西,因为它就是一个javascript对象。您收到的警告来自打字稿,而不是 Express。

      实际上,您通常会使用res.locals 来处理类似的事情。在打字稿中,它被定义为locals: Record<string, any>。所以你可以在你的中间件中设置res.locals.user,然后在你想要的任何地方访问它。

      【讨论】:

      • 谢谢,res.locals 工作正常,我想我会坚持下去。我无法理解的是为什么打字稿会给出错误,因为它清楚地识别出扩展界面中的自定义属性
      【解决方案3】:

      我不确定我的理解是否完全正确,但是,我认为最好的解决方案是创建一个自定义 Request 类,添加这个属性。

      export class CRequest extends Request {
          user?: string
          //add stuff to constructor etc
      }
      

      现在,你想把它变成一个接口,只需用接口替换类 我也不建议您使用与 Express & Request 相同的名称

      【讨论】:

      • 感谢您的回复。我想我在这里想要理解的是为什么打字稿在我尝试编译它时会出错,当我在编写代码时它可以清楚地看到自定义属性
      猜你喜欢
      • 2022-01-24
      • 2021-01-07
      • 2020-02-28
      • 2017-11-23
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 2023-04-08
      相关资源
      最近更新 更多