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

NestJS中EmailConfirmationGuard无法获取已认证user对象如何解决

问题根源

NestJS 基于TypeScript装饰器机制运行,多个独立的 @UseGuards 装饰器的执行顺序为从下往上,你当前的写法会先执行 EmailConfirmationGuard,再执行 JwtAuthGuard。前者执行时JWT身份校验还未完成,自然无法获取到挂载在请求对象上的用户信息。

解决方案

方案1:合并守卫到同一个@UseGuards装饰器(最推荐)

同一@UseGuards内传入的守卫会按传入顺序从前到后执行,保证JWT校验先完成,再校验邮箱状态:

@UseGuards(JwtAuthGuard, EmailConfirmationGuard)
@Post("/update-profile")
@UseInterceptors(FileInterceptor("file"))
async updateProfile(@UploadedFile() file: Express.Multer.File, @Body("full-name") fullname: string,@Request() req) {
  // 业务逻辑
}

方案2:调整独立@UseGuards的排列顺序

如果你需要分开声明两个守卫,把EmailConfirmationGuard放到JwtAuthGuard上方即可:

@UseGuards(EmailConfirmationGuard)
@UseGuards(JwtAuthGuard)
@Post("/update-profile")
@UseInterceptors(FileInterceptor("file"))
// 其余代码不变

额外校验项

如果修改顺序后仍无法获取用户,可排查两个问题:

  • 确认JwtAuthGuard逻辑正常,校验通过后确实将用户信息挂载到了request.user属性上
  • 确认请求头中携带了格式正确的Authorization: Bearer <你的JWT令牌>认证信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:54:04