NestJS中verifyEmail方法执行到Promise后无进展问题排查
问题分析与解决方案
核心问题1:@Res() 参数类型错误,导致响应无法发送
你的代码中@Res() res: Request的类型声明完全错误,@Res()注入的应该是Express(或Fastify)的Response对象,而非Request。这会导致res.res大概率是undefined,调用redirect的代码根本没执行,请求一直处于挂起状态,自然看不到后续进展。
核心问题2:异步查询未正确处理
userRepository.findOne()是异步方法,返回Promise,但你既没有用await等待查询完成,也没有处理Promise的结果或错误。虽然这不是直接导致请求挂起的原因,但会让你无法根据token的有效性执行对应逻辑(比如无效token跳转错误页)。
修复后的代码示例
@Get("confirm/:token") async verifyEmail(@Param("token") token: string, @Res() res: Response) { console.log("confirm called") console.log(token); // 等待异步查询完成 const user = await this.userRepository.findOne({where: {token: token}}); console.log("查询到的用户:", user); // 新增token有效性判断逻辑 if (!user) { return res.redirect("/home/error"); } // 正确发送跳转响应 return res.redirect("/home/welcome"); }
额外优化方案
如果不想手动接管响应控制权,可以去掉@Res(),直接返回RedirectResponse,让NestJS自动处理响应:
@Get("confirm/:token") async verifyEmail(@Param("token") token: string) { const user = await this.userRepository.findOne({where: {token: token}}); if (!user) { return RedirectResponse.redirect("/home/error"); } return RedirectResponse.redirect("/home/welcome"); }
同时建议用try/catch包裹异步查询逻辑,避免未捕获的Promise错误导致服务异常。
内容的提问来源于stack exchange,提问作者DevZer0
相关产品推荐
相关产品推荐

