是否可以使用 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
阅读有关环境变量的文档
我想创建一个 @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
阅读有关环境变量的文档