Nest не может разрешить зависимости службы, которая импортирует JwtService - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь использовать @ nestjs / jwt .В частности, его метод registerAsync (моя служба конфигурации загружает конфигурацию асинхронно).Я регистрирую JwtModule в AuthModule, который затем загружает определенные модули для каждого провайдера входа / регистрации.Затем я добавляю JwtService к поставщикам EmailService, но это не удается.

Структура приложения выглядит следующим образом (очень схематично):

app.module.ts

@Module({
  imports: [
    AuthModule,
    ...
  ]
})
export class ApplicationModule {}

auth.module.ts

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.registerAsync({
      useFactory: async (config: ConfigService) => ({
        secretOrPrivateKey: config.get('jwt.secret')
      }),
      inject: [ConfigService]
    }),
    EmailAuthModule
  ],
  exports: [JwtModule]
})
export class AuthModule {}

email.module.ts

@Module({
  imports: [...],
  controllers: [...],
  providers: [EmailService, ...]
})
export class EmailAuthModule {}

email.service.ts

@Injectable()
export class EmailService {
  constructor(
    private readonly jwtService: JwtService
  ) {}
}

При запуске приложения происходит сбой с этой ошибкой:

Nest can't resolve dependencies of the EmailService (UsersService, ?). Please make sure that the argument at index [1] is available in the current context. +70ms
Error: Nest can't resolve dependencies of the EmailService (UsersService, ?). Please make sure that the argument at index [1] is available in the current context.
    at Injector.lookupComponentInExports (/Users/.../api/node_modules/@nestjs/core/injector/injector.js:146:19)
    at process._tickCallback (internal/process/next_tick.js:68:7)
    at Function.Module.runMain (internal/modules/cjs/loader.js:745:11)
    at Object.<anonymous> (/Users/.../api/node_modules/ts-node/src/_bin.ts:177:12)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)

Что я пропустил?

1 Ответ

0 голосов
/ 20 сентября 2018

Сервисы не являются глобальными, но могут использоваться только в модулях, которые предоставляют их сами, или импортировать их из другого модуля, экспортирующего сервис.

Проблема здесь в том, что EmailService зависит от JwtService но EmailAuthModule не предоставляет ни самого JwtService, ни импортирует модуль, который экспортирует JwtService.(К сожалению, вы пропустили EmailAuthModule imports здесь.)

Поэтому, чтобы решить эту проблему, вы должны импортировать либо сам JwtModule, либо другой модуль, который экспортирует JwtModule в EmailAuthModule.

...