禁用 NestJS 中所有 POST 的状态 201

Ghe*_*man 9 javascript node.js nestjs

我的客户期望所有成功的状态代码都等于 200。但是 NestJS 默认对所有 POST 方法使用 201。如何在应用程序范围内禁用 POST 201?不是针对一种方法,而是针对整个应用程序。

zem*_*mil 27

您应该为每个控制器指定状态代码

根据官方文档https://docs.nestjs.com/controllers#status-code

此外,默认情况下,响应的状态代码始终为 200,除了使用 201 的 POST 请求。我们可以通过在处理程序级别添加 @HttpCode(...) 装饰器来轻松更改此行为(请参阅状态代码)。

@Post()
@HttpCode(200)
create() {
  return 'This action adds data';
}
Run Code Online (Sandbox Code Playgroud)

Nestjs 还有另一种依赖库(express/fastify)的方法:

我们可以使用特定于库的(例如 Express)响应对象,可以使用方法处理程序签名中的 @Res() 装饰器注入该对象(例如 findAll(@Res() response))。通过这种方法,您有能力(也有责任)使用该对象公开的本机响应处理方法。例如,使用 Express,您可以使用像 response.status(200).send() 这样的代码构建响应

但如果可能的话,我建议使用Reponse.ok来在客户端识别成功响应


sou*_*rri 10

做一个拦截器。但是说实话,201 有什么不好呢?

import { CallHandler, ExecutionContext, Injectable, HttpStatus } from '@nestjs/common';
import { map } from 'rxjs/operators';

@Injectable()
export class PostStatusInterceptor {
  intercept(context: ExecutionContext, next: CallHandler) {
    const ctx = context.switchToHttp();
    const req = ctx.getRequest();
    const res = ctx.getResponse();
    return next.handle().pipe(
      map(value => {
        if (req.method === 'POST') {
          if (res.statusCode === HttpStatus.CREATED) {
            res.status(HttpStatus.OK);
          }
        }
        return value;
      }),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

https://docs.nestjs.com/interceptors