首页 > 解决方案 > Nest JS 拦截器的依赖注入未定义

问题描述

我创建了一个拦截器,如下所示,我希望在全局范围内使用它。我将拦截器添加到我的模块并进行设置,以便 Nest 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 问题。

标签: nestjs

解决方案


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

对代码的更改很简单,只需要我更改AuthInterceptorModulefrom:

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 {}

推荐阅读