Проблема с типами typescript промежуточного программного обеспечения Express-jwt

#node.js #typescript #express #jwt #express-jwt

#node.js #typescript #экспресс #jwt #express-jwt

Вопрос:

Я пытаюсь реализовать экспресс-API, который проверяет подлинность с помощью токена jwt, и я использую промежуточное программное обеспечение 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 amp; { user: unknown } , но тогда функция больше не подходит для express.

Любые идеи, что я могу здесь сделать. Если ситуация ухудшится, могу ли я просто сказать TypeScript, чтобы он как-то заткнулся, поскольку я знаю, что поле будет там (хотя я знаю, что это не суть TypeScript)

Комментарии:

1. Было бы неплохо увидеть ExpressJWTRequest объект, экспортированный из @types/express-jwt , но, к сожалению, для этого, похоже, ничего нет: (

Ответ №1:

user не является существующим свойством req объекта. Вы можете создавать свои собственные типы для req object, создавая .d.ts файл в своем проекте, например, создайте express.d.ts файл, и он будет содержать:

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

Демонстрация: https://repl.it/repls/OldlaceWhoppingComputationalscience

Попробуйте удалить express.d.ts , и ошибка появится снова.

Комментарии:

1. Если я создаю тип declare namespace ExpressJWT { export interface JWTRequest extends express.Request { user: unknown } } , я получаю (property) ExpressJWT.JWTRequest.user: unknown Object is of type 'unknown'.ts(2571)

2. Я уже пробовал что-то подобное, и это тоже не сработало

3. Предполагается, что пространство имен должно быть Express , а не ExpressJWT , вы пробовали мое? Проверьте мой repl.it

Ответ №2:

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

это пример пользовательского интерфейса

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