Nano Hash - криптовалюты, майнинг, программирование

Внедрение зависимостей для JS-перехватчика Nest не определено

Я создал перехватчик, как показано ниже, и хочу использовать его по всему миру. Я добавил перехватчик в свой модуль и настроил его так, чтобы nest js обрабатывал DI за меня согласно NestJS Docs, однако, когда я делаю запрос в свою службу, я получаю сообщение об ошибке с указанием Cannot read property log of undefined, поэтому кажется, что NestJS не заботится о DI.

Код перехватчика:

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.

05.03.2020

  • Можете ли вы добавить полную ошибку, которую вы получаете, а также то, как вы добавляете модуль в свой проект, и , если вы добавляете перехватчик где угодно (вы не должны просто хотеть дважды проверить) 06.03.2020
  • Полная ошибка: TypeError: Cannot read property 'log' of undefined Я не могу опубликовать полную трассировку стека из-за политики компании, но журнал - это метод loggerService, который зависит от AuthInterceptor в соответствии с приведенным выше кодом. Перехватчик добавляется модулем к моему app.module.ts внутри массива imports ключей. imports: [AuthInterceptorModule] Я никуда не добавляю перехватчик. 06.03.2020
  • Ничто не кажется неправильным. Есть ли еще какой-нибудь код, которым вы можете поделиться? Является ли средство ведения журнала Singleton (по умолчанию) областью действия или областью действия запроса? У вас есть репродукция этого? У меня нет проблем с внедрением службы временного регистратора в nestjs-ogma, поэтому я любопытно, что здесь происходит 06.03.2020
  • @JayMcDoniel спасибо за вашу помощь! на самом деле это оказалось проблемой с зависимостью, которую я использовал внутри своей службы ведения журнала. Зависимость службы регистратора была ограничена запросом, и поэтому это означало, что мой перехватчик также должен был иметь область действия запроса. Как только я это сделал, все заработало. 07.03.2020
  • Рад, что смог помочь разобраться в проблеме. Я заметил, что если усилители не работают должным образом, это обычно проблема определения объема 07.03.2020

Ответы:


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

to

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 {}
06.03.2020
  • Спасибо! Я добавил @Injectable({ scope: Scope.REQUEST }) в свой класс ведения журнала, который, как я думал, будет пузырить область запроса к перехватчику, так как я его вводил, но мне пришлось добавить его к провайдеру APP_INTERCEPTOR, как вы предлагаете, чтобы он работал 18.12.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..