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

Posted

技术标签:

【中文标题】如何从控制器在nestjs应用程序中发送错误代码?【英文标题】:how to send error codes in nestjs app from controller? 【发布时间】:2019-11-14 21:46:33 【问题描述】:

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

  save(  @Body() body:any,@Res() response: Response):string 

console.log("posting...")
    console.log(body)
    return "saving " + JSON.stringify(body)

  

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

【问题讨论】:

【参考方案1】:

所以返回http状态码的完整示例既不抛出错误,也不通过静态@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));
  

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

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

【讨论】:

对于诸如 Spring 中的工作方式之类的事情,您可以制作一个拦截器来读取响应类并根据需要设置状态。我真的不喜欢这种方法,因为 Nest 专门为错误处理创建了异常过滤器类(我认为 400/500 错误代码是错误) 在nestjs中使用@Res是一个非常糟糕的习惯,因为它不能与拦截器等许多功能一起使用,我强烈推荐this answer instead, cause this is official and standard way【参考方案2】:

无论你写什么代码,它都会出现在你的回复中

@HttpCode(204)
create() 
  return 'This action adds a new cat';

【讨论】:

【参考方案3】:

您总是可以抛出一个错误,让 Nest 为您处理错误代码。 The documentation has a great bit on what errors are already 已定义,它们是常见的 HTTP 错误,因此它们遵循预期的代码。或者你可以抛出你自己的错误,following the syntax in the docs

【讨论】:

难道没有更直接的方法,比如返回某种Response 对象而不是字符串? 为什么要发送错误状态而不抛出错误?除了我提到的,你可以使用res.status(400).send(stringifiedBody) 是的,谢谢,这就是我正在寻找的答案。很抱歉投了反对票,只是在后台我抛出异常是considered 一个反模式。【参考方案4】:

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

根据您的情况,您需要:

throw new BadRequestException(error);

或者你可以使用

throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);

这将返回


  "statusCode": 403,
  "message": "Forbidden"

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

【讨论】:

【参考方案5】:

我做错了,当我不得不从 express 导入响应对象时,我正在从 nestjs/common 导入响应。

【讨论】:

【参考方案6】:

要在nestjs 中返回状态码,您需要在参数中包含@Res()。通常在nestjs中,Response对象的passthrough选项默认设置为false。这意味着您所做的任何事情都不会传递到 Response 对象中。

您不需要返回响应对象,因为您会收到这样的错误,因为它会尝试用标准的 nestjs 响应替换您的自定义响应。

标头发送到客户端后无法设置

此外,应在发送响应之前设置状态,否则它将默认为状态代码 200。

async myfunction(@Param('id') id: string, @Res(passthrough: true) response: Response) 

   //do stuff ....

   response.status(HttpStatus.FORBIDDEN).send('You are not allowed to do that');
   return;

【讨论】:

以上是关于如何从控制器在nestjs应用程序中发送错误代码?的主要内容,如果未能解决你的问题,请参考以下文章

Nestjs如何同时使用http请求和Websocket

如何在 NestJS 控制器处理程序的请求中获取“已验证的正文”和“已验证的用户”?

如何在 Nestjs 中获取用户信息?

如何在 Microsoft Visual Studio 2019 中调试 nestjs 程序?

NestJS:如何在@Query 对象中转换数组

如何在 NestJS 中使用多语言电子邮件模板?