You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

扩展Express Request类型时提示client缺失的TypeScript问题

为Express Request类型扩展client属性时遇到类型错误问题

我正在开发一个API,需要给Express的Request类型添加额外的client属性,用来验证客户端是否已认证,但目前碰到了类型错误。


相关代码

控制器代码

export class AuthMiddleware {
    async isAuthenticatedClient(req: GetClientAuthInfoRequest, res: Response) {
        const { token } = req.cookies

        if (!token) {
            res.status(401).send({
                message: "Faça login para acessar esse conteúdo"
            })
        }

        const decoded = jwt.verify(token, "sgjlskdfghajhdfghsd") as JwtPayload;
        req.client = await prisma.client.findUnique({
            where: {
                id: decoded.id
            }
        });
    }

}

Express扩展接口及Client类型(分文件存放)

import { Request } from "express"
import { Client } from "./Client.types"

export interface GetClientAuthInfoRequest extends Request {
    client: Client | null
}

export type Client = {
    name: string
    email: string
    password: string
}

报错的路由代码

router.route('/teste').get(authMiddleware.isAuthenticatedClient, authController.teste) // 这个路由仅返回简单消息用于测试中间件

解决方法

1. 全局扩展Express Request类型

创建专门的TypeScript声明文件(如src/types/express.d.ts),而非普通ts文件,确保TypeScript能自动识别扩展:

import { Client } from '../path/to/Client.types';

declare global {
  namespace Express {
    interface Request {
      client?: Client | null;
    }
  }
}

注意根据项目结构调整Client的导入路径。

2. 修正中间件实现

去掉自定义的GetClientAuthInfoRequest,直接使用扩展后的Express Request类型,同时补充NextFunction参数确保请求能继续流转:

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

export class AuthMiddleware {
    async isAuthenticatedClient(req: Request, res: Response, next: NextFunction) {
        const { token } = req.cookies;

        if (!token) {
            return res.status(401).send({
                message: "请登录以访问该内容"
            });
        }

        try {
            const decoded = jwt.verify(token, "sgjlskdfghajhdfghsd") as JwtPayload;
            req.client = await prisma.client.findUnique({
                where: {
                    id: decoded.id
                }
            });
            next(); // 必须调用该方法让请求进入下一个处理环节
        } catch (err) {
            return res.status(401).send({
                message: "无效的登录凭证"
            });
        }
    }
}

3. 检查tsconfig配置

确保tsconfig.json中包含类型声明文件的扫描路径:

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

内容的提问来源于stack exchange,提问作者Pedro Souza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:12:53