【问题标题】:How to pass instance of REQUEST scoped service to global interceptor如何将请求范围服务的实例传递给全局拦截器
【发布时间】:2020-06-04 16:20:31
【问题描述】:

我在后端使用Nest JS。我有日志服务scoped.Request

@Injectable({ scope: Scope.REQUEST })
export class LoggingService extends BaseLoggerService implements LoggerService {
  constructor(readonly configService: ConfigurationService, @Inject(RequestContextService) readonly requestContextService: IRequestContextService) {}

我有需要日志服务的全局拦截器。

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
    constructor(@Inject(LoggingService) private readonly logger: LoggingService) {
    }  }

现在在 app.ts 中,我试图绕过 Logging service 的实例来定义 useGlobalInterceptors。但是,它会在npm run start 上引发错误。

app.useGlobalInterceptors(new LoggingInterceptor(app.get(LoggingService)));

错误

2020-02-20T10:51:54.409Z ERROR [object Object] (RID:NOT_SET RP:NOT_SET TK:) (AN:NOT_SET COM:NOT_SET UAN:NOT_SET) LoggingService is marked as a scoped provider. Request and transient-scoped providers can't be used in combination with "get()" method. Please, use "resolve()" instead. Error: LoggingService is marked as a scoped provider. Request and transient-scoped providers can't be used in combination with "get()" method. Please, use "resolve()" instead.

【问题讨论】:

    标签: angular interceptor nestjs


    【解决方案1】:

    正如错误所述,由于LoggerServiceREQUEST 作用域,您需要使用await app.resolve<LoggingService>(LoggingService),但是,您可能想要做的是全局绑定拦截器并让Nest 处理通过将拦截器添加到 providers 数组来进行依赖注入,如下所示:

    @Module({
      imports: [...],
      providers: [
        {
          provide: APP_INTERCEPTOR,
          useClass: LoggingInterceptor
        },
        ...
      ]
    })
    export class AppModule {}
    

    要记住的是,拦截器已经拥有整个请求上下文可用。另外,我不确定增强器在 REQUEST 范围内如何发挥作用(如果它具有 REQUEST 范围的依赖项会发生这种情况),所以请记住,这可能不是最好的前进路线。

    【讨论】:

    • 您好,谢谢您的回答。但是,我面临另一个问题。我在 RequestContextService 中注入 REQUEST,它是 Logging Service 的一部分。但是,当我在拦截器中调试时,会创建登录服务实例,但请求始终为空。你知道怎么解决吗
    • 就像我说的,我不知道增强器(即拦截器、过滤器、守卫和管道)是否可以在请求范围内。您的一种选择是从拦截器获取请求并将其传递给记录器,以便它可以进一步向下传递,但现在您正在针对框架工作。另一条前进路线可能是更好的答案
    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-06
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多