是否有技巧可以让 useValue 依赖注入在 Nest.js 拦截器中正常工作?我有一个类似于此的动态模块:@Module({})export class SomeFeatureModule { static
是否有技巧可以让 useValue
Nest.js 拦截器的依赖注入正常工作?我有一个类似于此的动态模块:
@Module({})
export class SomeFeatureModule {
static register({
perRequestParams,
...clientOptions
}: ModuleOptions): DynamicModule {
const provider = new SomeClientProvider(clientOptions);
return {
module: SomeFeatureModule,
providers: [
{
provide: SomeClientProvider,
useValue: provider,
},
{
provide: SomeInterceptor,
useValue: new SomeInterceptor(provider, perRequestParams),
},
],
exports: [SomeClientProvider, SomeInterceptor],
};
}
}
...其中的 SomeInterceptor
课程是这样的:
@Injectable()
export class SomeInterceptor implements NestInterceptor {
constructor(
private readonly someClientProvider: SomeClientProvider,
private readonly perRequestParams: (
context: ExecutionContext,
) => EvaluationCriteria | Promise<EvaluationCriteria>,
) {}
async intercept(
execContext: ExecutionContext,
next: CallHandler<any>,
): Promise<Observable<any>> {
const params = await this.perRequestParams(execContext);
return this.someClientProvider.injectLocalStorageData(params, () => next.handle());
}
}
...但是当我尝试 使用 拦截器时:
@UseInterceptors(SomeInterceptor)
...我收到错误:
错误:Nest 无法解析 SomeInterceptor(SomeClientProvider,?)的依赖项。请确保索引 [1] 处的参数函数在 AppModule 上下文中可用。
我专门导入了 SomeFeatureModule.register(...)
我的 AppModule
:
@Module({})
export class AppModule {
static register(env: Environment): DynamicModule {
// ...
return {
module: AppModule,
imports: [
SomeFeatureModule.register({
...clientConfig,
async perRequestParams(ctx) {
// ...
},
}),
],
// ...
};
}
}
为什么依赖注入系统会尝试解析构造函数参数, SomeInterceptor
即使我已经手动提供了一个?
请注意,如果我删除它, @Injectable()
就不会出现相同的启动错误,但是拦截器的构造函数在没有参数的情况下被调用,因此这也会损坏。