我有一个全局拦截器,但无需在指定的控制器中应用。
app.useGlobalInterceptors(new ResponseInterceptor());
@Get()
async method(@Query() query) {
code here......
}
有人知道怎么做吗?
答案 0 :(得分:0)
如果拦截器是全局拦截器,则它将将应用于所有对象。解决此问题的唯一方法是将某种自定义元数据应用于路由,以告知拦截器不要针对该路由运行。您需要在拦截器中添加检查以查找该元数据。您可能正在寻找这样的东西
export function OgmaSkip() {
return (
target: any,
key?: string | symbol,
descriptor?: TypedPropertyDescriptor<any>,
) => {
if (descriptor) {
Reflect.defineMetadata(OGMA_INTERCEPTOR_SKIP, true, descriptor.value);
return descriptor;
}
Reflect.defineMetadata(OGMA_INTERCEPTOR_SKIP, true, target);
return target;
};
}
在此装饰器将元数据应用于控制器或方法的地方,然后在拦截器中,您可以应用如下检查:
public shouldSkip(context: ExecutionContext): boolean {
const decoratorSkip =
this.reflector.get(OGMA_INTERCEPTOR_SKIP, context.getClass()) ||
this.reflector.get(OGMA_INTERCEPTOR_SKIP, context.getHandler());
if (decoratorSkip) {
return true;
}
}
在我的实际代码库中,我对此检查有更多的逻辑,但这应该是您的起点。
答案 1 :(得分:0)
您可以绑定拦截器
@UseInterceptors(ResponseInterceptor)
@Get()
async method(@Query() query) {
code here......
}
https://docs.nestjs.com/interceptors
希望会有所帮助