TypeScript 错误:尝试在 Express 中访问 req.user 时,类型“Request”上不存在属性“user”

问题描述 投票:0回答:1

我正在使用 TypeScript 开发 Express 应用程序,但遇到了 TypeScript 无法识别 Request 对象上的用户属性的问题。具体来说,我的控制器中出现以下错误:

Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.ts(2339)

这是我的控制器代码的相关部分:

export const getUserDetails = AsyncHandler(
  async (req: Request, res: Response, next: NextFunction) => {
    try {
      if (req.user) {  // <-- Error happens here
        const user = await getUserDetailsService(req.user.id, req.user.email);
        res.status(200).json({ success: true, user });
      } else {
        return next(new ErrorHandler('User not authenticated', 401));
      }
    } catch (error) {
      return next(new ErrorHandler('Internal server error', 500));
    }
  }
);

我知道 req.user 在我的身份验证中间件中设置如下:

export const isAuthenticated = (req: Request, res: Response, next: NextFunction) => {
  const token = req.cookies.access_token;
  if (!token) {
    return res.status(401).json({ message: 'Not authenticated' });
  }
  try {
    const decoded = jwt.verify(token, process.env.JWT_SECRET as string) as UserData;
    req.user = decoded;  // Setting req.user here
    next();
  } catch (error) {
    return res.status(401).json({ message: 'Token is not valid' });
  }
};

1。扩展 Express Request 接口:

我创建了一个文件来扩展请求接口,以便识别用户:

// src/@types/express/index.d.ts
import { UserData } from '../interfaces/user'; // Adjust the path

declare namespace Express {
  interface Request {
    user?: UserData;  // Making it optional
  }
}

2。更新了 tsconfig.json:

我确保 TypeScript 包含我的自定义类型定义:

{
  "compilerOptions": {
    "typeRoots": ["./node_modules/@types", "./src/@types"]
  },
  "include": ["src/**/*.ts", "src/@types/**/*.d.ts"]
}

3.重新启动 TypeScript 编译器: 进行这些更改后,我重新启动了 TypeScript 编译器(ts-node、nodemon),但问题仍然存在。

完全错误:

src/controllers/user.controller.ts:107:15 - error TS2339: Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.

107       if (req.user) {
        

问题:

为了正确扩展请求接口以包含用户属性,我缺少什么?我还需要配置其他东西才能使其正常工作吗?

附加信息:

TypeScript 版本:4.0+ 快速版本:4.x 我使用 @types/express 进行类型定义。

提前感谢您的帮助!

node.js typescript type-conversion node-modules typescript-typings
1个回答
0
投票

这是因为

Request
类型默认没有任何
user
属性,在我看来它不应该有它。为了使您的案例发挥作用,您可以将类型声明更改为

  async (req: Request & { user: string} , res: Response, next: NextFunction) => {}

我看到您尝试更改界面,但我认为这不是一个好主意。您应该扩展现有的接口,然后不要忘记

export
它。您当前的实现可能无法正常工作,因为您尚未导出
Request
接口。

© www.soinside.com 2019 - 2024. All rights reserved.