如何从控制器发送nestjs应用程序中的错误代码?

use*_*310 32 javascript typescript nestjs

除了200之外,我如何在nestjs中发送错误代码?我尝试在方法中注入响应对象,但没有方法发送错误。

save(@Body() body: any, @Res() response: Response): string {
    console.log("posting...")
    console.log(body)
    return "saving " + JSON.stringify(body)
}
Run Code Online (Sandbox Code Playgroud)

上面的代码发送带有 20X 状态的正文,我想发送不同的状态代码,例如 400 或 500。

小智 57

您应该在您的情况下使用异常过滤器。

在您的情况下,您将需要:

throw new BadRequestException(error);
Run Code Online (Sandbox Code Playgroud)

或者你可以使用

throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
Run Code Online (Sandbox Code Playgroud)

那将会返回

{
  "statusCode": 403,
  "message": "Forbidden"
}
Run Code Online (Sandbox Code Playgroud)

文档: https: //docs.nestjs.com/exception-filters


Art*_*sun 21

因此,返回 http 状态代码的完整示例既不抛出错误,也不通过 static @HttpCode()

import { Post, Res, HttpStatus } from '@nestjs/common';
import { Response } from 'express';
...
  @Post()
  save(@Res() response: Response) {
    response
      .status(HttpStatus.BAD_REQUEST)
      .send("saving " + JSON.stringify(body));
  }

Run Code Online (Sandbox Code Playgroud)

您需要使用@Res()装饰器来获取底层express Response对象并使用它的status()方法。

虽然我仍然想知道是否有其他方法不涉及操作有状态对象,而只是像在 spring 中那样在 Nestjs 中进行干净的返回......


小智 9

无论您要编写什么代码,它都会出现在您的响应中

@HttpCode(204)
create() {
  return 'This action adds a new cat';
}
Run Code Online (Sandbox Code Playgroud)


Jay*_*iel 2

您始终可以抛出错误并让 Nest 为您处理错误代码。该文档详细介绍了已定义的错误,并且它们是常见的 HTTP 错误,因此它们遵循预期的代码。或者您可以按照文档中的语法抛出自己的错误

  • 像 201 创建和 202 接受这样的成功代码不是错误,但最好在响应中设置正确的状态代码。为这些抛出错误感觉真的很不对劲 (2认同)