node.js - Hur man lägger till egna egenskaper på Request-objektet i Express + TypeScript?


Jag försöker lägga till ett användarobjekt som en egen egenskap i Request-objektet i Express, men jag fick följande fel:

Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'

Detta är min kod i en middleware-funktion:

  // Authenticate person/user through the database.
  const person = new Person(username, password);
  const user = await authenticate(person); // ORM => read DB 
  if (!user) {
    return res
      .status(401)
      .json({ message: "Invalid Authentication Credentials" });
  }

  // attach user to request object
  req.user = user; // <= HERE is my problem
  next();

Hur kan jag lägga till denna anpassade egenskap i förfrågan?

Svar #1

Jag tycker att det vanliga sättet att göra detta är genom att utöka Response-gränssnittet som exporteras av Express och deklarera din Data som en del av den generiska typen Locals.

I @types/express/index.d.ts på rad 127:

export interface Response<ResBody = any, Locals extends Record<string, any> = Record<string, any>>
        extends core.Response<ResBody, Locals> {}

Du kan därför skapa en typ som kommer att användas istället för standardvärdet för den generiska Locals på följande sätt:

import type { Response, Request, NextFunction } from 'express';
import type { User } from './models'; // Or wherever it is, obviously.
type MyLocals = { user?: User; };
type MyResponse = Response<any, MyLocals>

// Using the `MyResponse` type is as simple as setting the type of `res` to be `MyResponse`, e.g.:

async function doSomeWork (req: Request, res: MyResponse, next: NextFunction): Promise<void> {
  console.log(res.locals.user); // undefined | User
}

Det finns några andra sätt att uppnå detta på också, men det här är vad jag alltid har gjort när jag använder Typescript + Express.