【问题标题】:how to send error codes in nestjs app from controller?如何从控制器在nestjs应用程序中发送错误代码?
【发布时间】: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。

【问题讨论】:

    标签: javascript typescript nestjs


    【解决方案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;
          }
          

          【讨论】:

            猜你喜欢
            • 2011-07-25
            • 1970-01-01
            • 2021-04-25
            • 1970-01-01
            • 2017-07-21
            • 2022-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多