【问题标题】:NestJS: My controller doesn't send the responseNestJS:我的控制器不发送响应
【发布时间】:2022-04-12 03:55:02
【问题描述】:

我有一个没有发回响应的控制器。

@Controller('/foo')
export class FooController {
  @Post()
  public async getBar(@Body() body: DTO, @Res() res) {
    const response = await this.doSomething(body);
    return response;
  }
}

我不得不使用res.send 方法:

@Controller('/foo')
export class FooController {
  @Post()
  public async getBar(@Body() body: DTO, @Res() res) {
    const response = await this.doSomething(body);
    res.send(response);
  }
}

【问题讨论】:

    标签: nestjs


    【解决方案1】:

    原因是@Res() res 参数。如果您删除它,将正确发送响应:

    @Controller('/foo')
    export class FooController {
      @Post()
      public async getBar(@Body() body: DTO) {
        const response = await this.doSomething(body);
        return response;
      }
    }
    

    【讨论】:

    • 如果您需要修改响应对象,请参阅来自 Nest 的警告:Nest 检测到处理程序何时使用 @Res() 或 @Next(),表明您已选择特定于库的选项.如果同时使用这两种方法,则该单一路线的标准方法会自动禁用,并且将不再按预期工作。要同时使用这两种方法(例如,通过注入响应对象以仅设置 cookie/标头但仍将其余部分留给框架),您必须在 @Res({ passthrough: true }) 装饰器。
    【解决方案2】:

    如果您希望使用 Nest 方式发送响应,则必须使用 @Res({ passthrough: true })

    如果您想在 Express 框架上发送响应,请使用 @Res() 并添加代码 res.status(200).send()

    https://docs.nestjs.com/controllers

    警告 Nest 检测到处理程序何时使用 @Res() 或 @Next(),表示您选择了特定于库的选项。如果 两种方法同时使用,标准方法是 自动禁用这条路线,将不再工作 正如预期的那样。同时使用这两种方法(例如,通过 注入响应对象只设置cookies/headers,但仍然 其余的留给框架),您必须设置直通选项 在 @Res({ passthrough: true }) 装饰器中为 true。

    【讨论】:

      猜你喜欢
      • 2015-10-19
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      相关资源
      最近更新 更多