Express + Typescript: Lägga till värden i router.param
Express 4.x API ger detta exempel på hur man använder Router.param:
router.param('user', function (req, res, next, id) {
// try to get the user details from the User model and attach it to the request object
User.find(id, function (err, user) {
if (err) {
next(err)
} else if (user) {
req.user = user
next()
} else {
next(new Error('failed to load user'))
}
})
})
Vad är det bästa sättet att få detta att fungera med TypeScript? Raden req.user=user kommer att misslyckas i det givna exemplet, eftersom express.Request-objektet inte har en user-egenskap.
Och när det fungerar, hur använder du det i ett senare router.get-anrop?
Svar #1
Skapa en ny fil som heter custom.d.ts.
Du kan sedan lägga till egenskaper i Express.Request-gränssnittet på det här sättet:
declare namespace Express {
export interface Request {
myNewProperty?: string
}
}
Detta kommer då att låta dig göra saker som detta:
app.param('user', function(req: Request, res: Response, next: NextFunction, id: string) {
User.find(id, function(err, user) {
if (err) {
next(err);
} else if (user) {
req.user = user;
next();
} else {
next(new Error('failed to load user'));
}
});
});
Du kan förhindra att egenskapen läggs till i varje begäran genom att skapa ett nytt gränssnitt som utökar Request-gränssnittet. Du kan sedan använda det nya gränssnittet i Express callback-funktionen på följande sätt:
interface RequestButCooler extends Request {
user?: string;
}
app.param('user', function(req: RequestButCooler , res: Response, next: NextFunction, id: string) {
// req.user is now available only here
});
