【问题标题】:Dependency Injection for Nest JS Interceptor is UndefinedNest JS 拦截器的依赖注入未定义
【发布时间】:2022-01-15 11:46:27
【问题描述】:

我创建了一个如下所示的拦截器,我希望在全局范围内使用它。我将拦截器添加到我的模块并进行了设置,以便嵌套 js 应该按照NestJS Docs 为我处理 DI,但是当我向我的服务发出请求时,我收到一个错误,指示 Cannot read property log of undefined 所以看起来 DI没有被 NestJS 照顾。

拦截器代码:

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { LoggingService } from './logging.service';

@Injectable()
export class AuthInterceptor implements NestInterceptor {
  constructor(private readonly loggingService: LoggingService) { }
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next
      .handle()
      .pipe(
        map((response) => {
          this.loggingService.log('Responded successfully');
          return response;
        })
      );
  }
}

拦截器模块:

import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { AuthInterceptor } from './auth.interceptor';
import { LoggingService } from './logging.service';

@Module({
  providers: [
    LoggingService,
    {
      provide: APP_INTERCEPTOR,
      useClass: AuthInterceptor,
    },
  ],
})
export class AuthInterceptorModule {}

我的应用程序根目录下的app.module.ts 导入了AuthInterceptorModule。我假设我搞砸了,但我不清楚如何解决这个 DI 问题。

【问题讨论】:

  • 你能添加你得到的完整错误,以及你如何将模块添加到你的项目中,如果你在任何地方添加拦截器(你不应该只是想要仔细检查)
  • 完全错误是:TypeError: Cannot read property 'log' of undefined 由于公司政策,我无法发布完整的堆栈跟踪,但 log 是 loggerService 的一种方法,它是上述代码中 AuthInterceptor 的依赖项。拦截器由模块添加到我的app.module.ts imports 键数组内。 imports: [AuthInterceptorModule]我没有在任何地方添加拦截器。
  • 看起来没有任何问题。您可以分享更多代码吗?记录器是单例(默认)范围还是请求范围?你有这个的复制品吗?我在nestjs-ogma 中注入瞬态记录器服务没有问题,所以我很好奇这里发生了什么
  • @JayMcDoniel 感谢您的帮助!这实际上最终成为我在记录器服务中使用的依赖项的问题。记录器服务的依赖是请求范围的,因此这意味着我的拦截器也必须是请求范围的。一旦我这样做了,它就可以正常工作了。
  • 很高兴我能帮助对问题进行分类。我注意到如果增强器无法正常工作,这通常是范围问题

标签: nestjs


【解决方案1】:

在发现我的 LoggingService 依赖于请求范围内的另一个依赖项后,我能够自己解决这个问题。由于我的拦截器中有一个请求范围的依赖项,这意味着我的拦截器也必须是请求范围的。

对代码的更改很简单,只需要我将AuthInterceptorModule 更改为:

import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { AuthInterceptor } from './auth.interceptor';
import { LoggingService } from './logging.service';

@Module({
  providers: [
    LoggingService,
    {
      provide: APP_INTERCEPTOR,
      useClass: AuthInterceptor,
    },
  ],
})
export class AuthInterceptorModule {}

到

import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR, Scope } from '@nestjs/core';
import { AuthInterceptor } from './auth.interceptor';
import { LoggingService } from './logging.service';

@Module({
  providers: [
    LoggingService,
    {
      provide: APP_INTERCEPTOR,
      scope: Scope.REQUEST,
      useClass: AuthInterceptor,
    },
  ],
})
export class AuthInterceptorModule {}

【讨论】:

  • 谢谢!我已将@Injectable({ scope: Scope.REQUEST }) 添加到我的日志记录类中,我认为自从我注入它以来,它会将请求范围冒泡到拦截器中,但我必须将它添加到APP_INTERCEPTOR 提供程序中,就像你建议的那样它才能工作
  • 谢谢!对于遇到此问题的其他任何人,我在APP_GUARD 提供程序上遇到了同样的问题。
猜你喜欢
  • 2019-01-14
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多