typescript 类型“Request〈ParamsDictionary,any,any,ParsedQs,Record〈string,any>>”上不存在属性“user”

2j4z5cfb  于 2023-01-10  发布在  TypeScript
关注(0)|答案(3)|浏览(385)

请帮助,我得到这个错误

src/app/middlewares/authentication.ts:16:17 - error TS2339: Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.

16             req.user = user;

我已经创建了. d.ts文件,并将其包含在tsconfig文件中。但我仍然无法运行此代码
请查看随附屏幕截图

gwbalxhn

gwbalxhn1#

1.在src目录中创建 * types * 文件夹
1.在types文件夹中创建一个文件夹,并使用要扩展的包的名称(在本例中为 * express *)。
1.在该文件夹中创建 * index. d. ts * 文件

src/
   - types/
    - express/
     - index.d.ts

1.将此代码添加到索引文件

import express from "express";

declare global {
  namespace Express {
    interface Request {
      user?: Record<string,any>
    }
  }
}

1.记得更新您的 * tsconfig. json * 文件

{
  "compilerOptions": {
    "typeRoots" : ["./src/types", "./node_modules/@types"]
  }
}

这个应该可以

qmelpv7a

qmelpv7a2#

我之前也遇到过同样的问题,下面是我的解决方法。
1.我在项目中创建了一个名为@types的单独目录,以便声明合并工作。
1.接下来我在里面创建了一个名为index.d.ts的文件,内容如下。请注意,我们需要在global中声明我们自己的请求。另外,导入express也很重要。

import * as express from "express"
declare global {
    namespace Express {
        interface Request {
            user? : Record<string,any>
        }
    }
}

1.我在tsconfig.json中的compilerOptions下添加了以下代码行。

"compilerOptions": {
     ...other settings,
     "typeRoots": ["@types", "node_modules/@types"],
     ...other settings
 }

就这样。它应该能适应这些变化。

shstlldc

shstlldc3#

另一种方式:

import { NextFunction, Request, Response } from 'express';

interface IDecode {
    address: string,
    role: string,
    iat: number,
    exp: number
  };

 interface RequestWithUserRole extends Request {
    user?: IDecode,
}

 const parseToken = (secret: string) => 
  async (req: RequestWithUserRole, res: Response, next: NextFunction) => {
    try{
      const token  = req.headers?.authorization?.split(' ')[1];
      // console.log(req.headers?.authorization);
      if (!token) {
        return res.status(403).json({message: 'Token not  found'})
      }
      const decodedData = <IDecode> jwt.verify(token, secret);
      req.user = decodedData;
      // console.log(decodedData);
      return next();
    }
    catch(e) {
      return res.status(500).json({e})  
    }
};

相关问题