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

问题描述

我正在尝试实现一个通过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,ParsedQs>'.ts(2339)

我尝试附加req: express.Request & { user: unkNown },但是此功能不再适合express。

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

解决方法

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

declare namespace Express {
   export interface Request {
       user: SomeType
   }
}

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

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

,
declare global {
  namespace Express {
    interface Request {
      user?: UserPayload;
    }
  }
}

这是UserPaylaod的一个例子

  interface UserPayload {
     id: string;
     email: string;
   }