【问题标题】:Typescript express typing on Request objectTypescript 在 Request 对象上快速输入
【发布时间】:2022-02-18 03:40:41
【问题描述】:

我的 Express Request 对象上的 Typescript 打字似乎有问题。该项目目前包含 2 个子项目(用户服务和一个包含可重用错误和中间件的公共项目)

common 文件夹作为依赖项安装在用户服务中,例如: "@myPackage/common": "file:../common",

我有一个当前用户中间件:

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

interface UserPayload {
  id: string;
  email: string;
}

declare global {
  namespace Express {
    interface Request {
      currentUser?: UserPayload;
    }
  }
}

const currentUser = (
  req: Request,
  res: Response,
  next: NextFunction,
) => {
  if (!req.session?.jwt) {
    return next();
  }

  try {
    const payload = jwt.verify(
      req.session.jwt,
      process.env.JWT_KEY!,
    ) as UserPayload;

    req.currentUser = payload;
  } catch (err) {
    console.error(err);
  }

  return next();
};

export default currentUser;

为 Request 对象的 currentUser 属性声明一个全局变量。

在我的用户服务项目中,我有以下路线

import express, { Request, Response } from 'express';
import { Middlewares } from '@myPackage/common';

const router = express.Router();

router.get('/api/users/currentuser', Middlewares.currentUser, (
  req: Request,
  res: Response,
) => {
  res.send({ currentUser: req.currentUser || null });
});

export default router;

req.currentUser 上,我收到以下错误消息:

“Request>”类型上不存在属性“currentUser”。

不应该在您导入它的代码中自动接管包类型吗?我希望我清楚问题是什么:)

【问题讨论】:

  • This answer 展示了如何扩展Response 对象,Request 对象可以类似处理。

标签: node.js typescript express


【解决方案1】:

我也一直在声明全局命名空间以将类型附加到 express 的请求对象时遇到问题。为自己找到了一个使用“声明模块”而不是“声明全局”的解决方案。所以不是

declare global {
  namespace Express {
    interface Request {
      currentUser?: UserPayload;
    }
  }
}

不妨试试以下方法:

declare module "express-serve-static-core" {
  interface Request {
    currentUser?: UserPayload;
  }
}

通常情况下,您的 currentUser 属性也应该可以在其他文件中使用这种方法,但如果没有,您当然可以导出操纵的请求接口。

请注意,在大多数情况下,您需要引用“express-serve-static-core”模块,因为这是声明请求接口的地方。

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2015-11-05
    • 2016-09-19
    • 2021-06-11
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 2012-08-17
    相关资源
    最近更新 更多