Express-jwt 中间件打字稿类型问题

Posted

技术标签:

【中文标题】Express-jwt 中间件打字稿类型问题【英文标题】:Express-jwt middleware typescript types issue 【发布时间】:2021-02-07 17:58:58 【问题描述】:

我正在尝试实现通过 jwt 令牌进行身份验证的 express API,并且我正在使用 express-jwt 中间件来验证对方法的访问:

import express from 'express'
import jwt from 'express-jwt'

const app = express()

app.get('/protected', jwt( secret: 'jwtSecret', algorithms: ['HS256'] ), prot)

const prot = (
    req: express.Request,
    res: express.Response,
    _next: express.NextFunction
): void => 
    res.json(
        msg: req.user,
    )


app.listen(3000)

但我收到此错误:

Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs>'.ts(2339)

我已尝试附加req: express.Request & user: unknown ,但该功能不再适合express。

我可以在这里做什么的任何想法。如果情况变得更糟,我可以告诉 TypeScript 以某种方式闭嘴吗,因为我知道该字段会在那里(尽管我知道这不是 TypeScript 的重点)

【问题讨论】:

很高兴看到从@types/express-jwt 导出的ExpressJWTRequest 对象,但不幸的是,似乎没有任何东西 :( 【参考方案1】:

user 不是 req 对象上的现有属性。您可以通过在您的项目中创建一个.d.ts 文件来为req 对象创建自己的类型,例如,创建一个express.d.ts 文件,它将包含:

declare namespace Express 
   export interface Request 
       user: SomeType
   

演示:https://repl.it/repls/OldlaceWhoppingComputationalscience

尝试删除express.d.ts,错误会再次出现。

【讨论】:

如果我输入 declare namespace ExpressJWT export interface JWTRequest extends express.Request user: unknown 我会得到 (property) ExpressJWT.JWTRequest.user: unknown Object is of type 'unknown'.ts(2571) 我已经尝试过类似的方法,但也没有用 名称空间应该是Express,而不是ExpressJWT,你试过我的吗?检查我的 repl.it【参考方案2】:
declare global 
  namespace Express 
    interface Request 
      user?: UserPayload;
    
  

这是 UserPaylaod 的示例

  interface UserPayload 
     id: string;
     email: string;
   

【讨论】:

以上是关于Express-jwt 中间件打字稿类型问题的主要内容,如果未能解决你的问题,请参考以下文章

打字稿混淆:如何使用自定义和绝对类型库扩展 Express `Request`?

如何在打字稿中使用中间件键入 redux thunk

预中间件中的猫鼬打字稿不存在

运行测试时如何优雅地跳过 express-jwt 中间件?

Typesafe Express 中间件和路由?

受保护路由的 jest.mock express-jwt 中间件行为