【NestJS】为什么return不返回客户端?

在 NestJS 中,当你使用了 @Res()(或 @Response())装饰器时,NestJS 会进入**"库原生模式"(Library-specific mode)**。

原因分析

一旦你在路由处理函数中注入了 @Res(),NestJS 就失去了对响应流的自动控制权。此时,NestJS 不再理会函数的 return ,它会认为你将手动处理响应(例如通过调用 res.send()res.json())。

在你提供的代码中:

  1. 你使用了 @Res() res: Response
  2. 你写了 return ret;
  3. 由于 NestJS 在等待你手动调用 res 的方法来结束请求,而你一直没调用,请求就会一直挂起(Pending),直到浏览器或服务器超时。

解决方案

你有三种方式可以解决这个问题:

方案一:手动调用 res.send()res.json() (推荐用于需要精细控制响应的情况)

既然你已经引入了 res 对象,就直接使用它来发送数据:

typescript 复制代码
@Get('confirm-email')
async confirmEmail(@Query('code') code: string, @Res() res: Response) {
  let ret = {
    code: RETCODE.EMAIL_CONFIRMATION_FAILED,
    access_token: null,
    message: 'Error 9004',
  };

  const userCode = await this.loginService.getCode(code, 1);
  if (!userCode) {
    console.log('User code not found');
    return res.status(200).json(ret); // 使用 res.json() 发送响应
  }
  
  // 注意:其他逻辑路径也必须通过 res 发送响应
}
方案二:使用 passthrough: true (最推荐:既想用 res 又想用 return)

如果你只想用 res 来设置一些东西(比如 Cookie、Header),但仍然希望由 NestJS 来处理 return 的返回值,可以设置 passthrough 参数:

typescript 复制代码
@Get('confirm-email')
async confirmEmail(@Query('code') code: string, @Res({ passthrough: true }) res: Response) {
  let ret = {
    code: RETCODE.EMAIL_CONFIRMATION_FAILED,
    access_token: null,
    message: 'Error 9004',
  };

  const userCode = await this.loginService.getCode(code, 1);
  if (!userCode) {
    return ret; // 此时 return 生效了,NestJS 会自动包装成 JSON 发送
  }
}
方案三:移除 @Res() (最简洁)

如果你在函数体里根本没用到 res 对象(比如只是为了定义类型却没调用它的方法),直接删掉它。这是 NestJS 的推荐做法,它会自动处理 return 的对象。

typescript 复制代码
@Get('confirm-email')
async confirmEmail(@Query('code') code: string) { // 移除 @Res
  let ret = {
    code: RETCODE.EMAIL_CONFIRMATION_FAILED,
    access_token: null,
    message: 'Error 9004',
  };

  const userCode = await this.loginService.getCode(code, 1);
  if (!userCode) {
    return ret; // 正常工作
  }
}

总结

在 NestJS 中,一旦用了 @Res(),你就得对响应负责 。如果不调用 res.send() 或设置 passthrough: true,客户端将永远等不到响应。

相关推荐
Hilaku6 分钟前
技术好就能升职是前端圈最大的谎言!
前端·javascript·程序员
lhldsg7 分钟前
树洞倾诉的核心需求与产品定位误区
java·前端·小程序
lskaixin8 分钟前
Git命令
git
光影少年20 分钟前
react navite高频手写/实操题
前端·javascript·react native·react.js·前端框架
hunterandroid33 分钟前
HarmonyOS 弱网与离线优先架构实战:请求队列、本地缓存与增量同步
前端·前端框架
lhldsg38 分钟前
宠物同城领养平台开发实战:从需求分析到上线部署指南
java·前端·小程序·需求分析·宠物
hunterandroid38 分钟前
Android 内存泄漏排查实战:从 LeakCanary 报警到根因定位
android·前端
AI视觉网奇39 分钟前
3d子部件高亮选中
开发语言·javascript·3d
leoZ23140 分钟前
AI+前端提效-12 AI辅助前端性能优化与监控:从开发到线上全流程提效
前端·人工智能·神经网络·自然语言处理·性能优化·keras·知识图谱
阿图灵42 分钟前
LangGraph 实战 03:Workflows 与 Agents——六种工作流模式与智能体实战(附 6 个可运行示例)
java·前端·javascript·工作流·ai agent·智能体·langgraph