node.js - Express-jwt middleware typescript typer problem


Jag försöker implementera ett Express API som autentiserar via en JWT-token och jag använder express-jwt-mellanmjukvara för att autentisera åtkomst till en metod:

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)

Men jag får det här felet:

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

Jag har försökt att bifoga req: express.Request & { user: unknown }, men då passar inte funktionen med express längre.

Några idéer på vad jag kan göra här. Om det blir värst tänkbart, kan jag bara säga åt TypeScript att vara tyst på något sätt, eftersom jag vet att fältet kommer att finnas där (även om jag vet att det inte är poängen med TypeScript)

Svar #1

user är inte en befintlig egenskap på req-objektet. Du kan skapa dina egna typer för req-objektet genom att skapa en .d.ts-fil i ditt projekt, till exempel, skapa en express.d.ts-fil och den kommer att innehålla:

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

Demo: https://repl.it/repls/OldlaceWhoppingComputationalscience

Försök att radera express.d.ts och felet kommer att dyka upp igen.

Svar #2

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

detta är ett exempel på UserPaylaod

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

Relaterade artiklar