如何从控制器在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 控制器处理程序的请求中获取“已验证的正文”和“已验证的用户”?