是否可以使用 NestJS 装饰器覆盖控制器方法的 return?

Is it possible to override the return of a controller method using a NestJS decorator?

我想创建一个 @IgnoreDev 装饰器,当它检测到我们是 运行 开发环境中的代码时,它会覆盖 NestJS 控制器上的方法 return。

例如:

@Controller()
class SomeController {

  @IgnoreDev
  async processMessage(...) {
    return 'processed';
  }
}

@IgnoreDev 注释会检测到 process.env.NODE_ENV === 'development' 和 return ignored 而不是 processed;

我同意 Mical Levi 的观点。您可以使用拦截器覆盖来自控制器的响应。

创建一个名为 response.override.interceptor.ts 的新文件 放置以下代码:

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from "@nestjs/common";
import { Observable } from "rxjs";
import { tap } from "rxjs/operators";

@Injectable()
export class OverrideResponseInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(
      map((data) => {
        if (process.env.NODE_ENV === "development") return "ignored ";
        else return "processed";
      })
    );
  }
}

创建拦截器后,您只需将 @UseInterceptors() 装饰器(从 nestjs/common 包中导入)放在控制器上,并将最近创建的拦截器传递给控制器装饰者。

@Controller()
class SomeController {

  @UseInterceptors(OverrideResponseInterceptor)
  async processMessage(...) {
    return 'processed';
  }
}

就是这样 您还可以观看有关拦截器的 youtube 视频,其中我对拦截器进行了详细说明 https://youtu.be/v5zvWQagcO0

额外小费

而不是使用 env 变量作为 process.env.NODE_ENV 我建议你使用 @nestjs/config 包,它提供了对环境变量的额外抽象。 有兴趣的可以看下面的视频https://youtu.be/7OJE4wwZ0R0 您还可以在 https://docs.nestjs.com/techniques/configuration

阅读有关环境变量的文档