【问题标题】:Express-jwt middleware typescript types issueExpress-jwt 中间件打字稿类型问题
【发布时间】: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 对象,但不幸的是,似乎没有任何东西 :(

标签: node.js typescript express jwt express-jwt


【解决方案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;
   }

【讨论】:

    猜你喜欢
    • 2020-03-06
    • 1970-01-01
    • 2020-08-27
    • 2018-02-06
    • 2018-10-11
    • 2020-07-07
    • 1970-01-01
    • 2017-06-12
    • 2020-01-17
    相关资源
    最近更新 更多