Внедрить компонент (Сервис) в другой компонент (Сервис), используя экспорт модулей

Я прочитал статью о документах nestjs об иерархической инъекции. Но у меня проблемы с его реализацией. В настоящее время у меня есть два модуля.AuthModule это модуль, который импортирует UserModule, UserModule содержит сервис, который используется в других модулях (где он работает правильно).

auth.module.ts

import * as passport from 'passport';
import {
  Module,
  NestModule,
  MiddlewaresConsumer,
  RequestMethod,
} from '@nestjs/common';
import { AuthService } from './auth.service';
import {JwtStrategy} from './jwt.straegy';

import {UserModule} from '../shared/user/user.module';

@Module({
  imports: [UserModule],
  components: [AuthService, JwtStrategy],
  exports: [AuthService]
})
export class AuthModule implements NestModule {
  public configure(consumer: MiddlewaresConsumer) {
    consumer
      .apply(passport.authenticate('jwt', { session: false }))
      .forRoutes({ path: '/cats', method: RequestMethod.ALL });
  }
}

user.module.ts

import {Module} from '@nestjs/common';
import {MongooseModule} from '@nestjs/mongoose';
import {UserSchema} from '../../schema/user.schema';
import {UserService} from './user.service';

@Module({
  imports: [
    MongooseModule.forFeature([{ name: 'UserInterface', schema: UserSchema }])
  ],
  components: [UserService],
  exports: [UserService]
})
export class UserModule {}

Проблема возникает, когда nestjs внедряет UserService в AuthService. Следующая ошибка обнаружена. Удаление службы из конструктора работ. Странно то, что UserService работает в других модулях.

Error: Nest can't resolve dependencies of the AuthService (?). Please verify whether [0] argument is available in the current context.

auth.service.ts

import * as jwt from 'jsonwebtoken';
import { Component } from '@nestjs/common';
import {UserService} from '../shared/user/user.service';

@Component()
export class AuthService {

  constructor(private readonly userService: UserService) {}

  async createToken(username) {
    const expiresIn = 60 * 60, secretOrKey = 'i am fake!';
    const user = {username};
    const token = jwt.sign(user, secretOrKey, {expiresIn});
    return {
      expires_in: expiresIn,
      access_token: token
    };
  }

  async validateUser(signedUser): Promise<boolean> {
    return !!(await this.userService.findByUsername(signedUser.username));
  }
}

1 ответ

Решение

Это странно, у меня есть почти такой же код, который работает, кажется, я заметил, я не уверен, в этом ли проблема здесь, но вы могли бы использовать authService в модуле пыльника? если это так, вам может понадобиться повторно экспортировать usersModule в authModule, чтобы в вашей текущей области он был:

в authModule:

exports: [UserModule, AuthService]

(Невозможно показать полный пример, так как stackru проснулся и неправильно подошел и не позволил мне добавить блок кода)

Если это изменение работает, вы могли бы "импортировать"(добавлен в массив компонентов) authService в другой модуль без импорта всего модуля authModule, если вы можете предоставить github repo весь код, он может быть более простым.

помните, authService теперь является частью authModule и никогда не должен добавляться непосредственно в пыльник модуля, а только через массив "import". Если это не ваш случай, вы можете предоставить github repo весь код, который может быть более легким для помощи

Другие вопросы по тегам