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

