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!

Relaterede artikler