node.js - Express typescript videregivelse af data mellem middleware
Jeg laver min første express-app med Typescript.
Jeg forsøgte at videregive data mellem middleware, som jeg gjorde i JavaScript (express-app)
i min javascript-app var det meget fint at overføre data mellem
hvad gør jeg galt her? hvor mangler jeg
interface IUserType extends Request {
user: {
id: string;
name: string;
};
}
const middleWare = (req: IUserType, res: Response, next: NextFunction) => {
req.user = {
id: "user_id",
name: "John Doe",
};
return next();
};
const getUser = (req: IUserType, res: Response) => {
console.log(req.user, "User Data");
return res.status(200).json({ user: req.user });
};
router.route("/user").get(middleWare, getUser);
men jeg fik disse typer fejl i TypeScript
No overload matches this call.
Overload 1 of 2, '(...handlers: RequestHandler<ParamsDictionary, any, any, ParsedQs>[]): IRoute', gave the following error.
Argument of type '(req: MyProfileRequest, res: Response, next: NextFunction) => void' is not assignable to parameter of type 'RequestHandler<ParamsDictionary, any, any, ParsedQs>'.
Types of parameters 'req' and 'req' are incompatible.
Property 'user' is missing in type 'Request<ParamsDictionary, any, any, ParsedQs>' but required in type 'MyProfileRequest'.
Overload 2 of 2, '(...handlers: RequestHandlerParams<ParamsDictionary, any, any, ParsedQs>[]): IRoute', gave the following error.
Argument of type '(req: MyProfileRequest, res: Response, next: NextFunction) => void' is not assignable to parameter of type 'RequestHandlerParams<ParamsDictionary, any, any, ParsedQs>'.
Type '(req: MyProfileRequest, res: Response, next: NextFunction) => void' is not assignable to type 'RequestHandler<ParamsDictionary, any, any, ParsedQs>'.ts(2769)
min kode i codesandbox :Kode Link
Jeg forventede ingen typefejl, fordi jeg havde specificeret, hvad mine typer ville være 😭
Svar #1
Tricket er at bruge TypeScript-deklarationsfiler til at udvide Express-navnerummet. I roden af dit projekt (hvor din index.ts ligger), skal du oprette en fil kaldet decs.d.ts og tilføje dette:
type User = {
id: string;
name: string;
};
declare namespace Express {
interface Request {
user?: User;
}
}
Derefter kan du i din index.ts bruge det, som du normalt ville:
import express from 'express';
import type { Request, Response, NextFunction, RequestHandler } from 'express';
const app = express();
const middleware = (req: Request, res: Response, next: NextFunction) => {
req.user = {
id: 'user_id',
name: 'John Doe',
};
return next();
};
const getUser: RequestHandler = (req, res) => {
console.log(req.user, 'User Data');
return res.status(200).json({ user: req.user });
};
app.get('/foo', middleware, getUser);
Ikke flere typefejl!
