扩展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
相关产品推荐
相关产品推荐

