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.
