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 中间件打字稿类型问题的主要内容,如果未能解决你的问题,请参考以下文章