Не загружается зависимость NestJS — JWT

#node.js #nestjs #jwt-auth

#node.js #nestjs #jwt

Вопрос:

Мне не нужен полный паспорт, мне просто нужно подписать токен JWT.

Я пытался работать с этим репозиторием, я перепробовал все возможные комбинации, но я просто не могу интегрировать его в проект. Я проследил за ходом нескольких различных ошибок. Я исправляю одно, и появляется другое. Итак, я включаю минимальную часть и текущую ошибку, которая выдается.

AuthModule:

 import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { AuthService } from './auth.service';
import { JwtService } from '@nestjs/jwt';

@Module({
  imports: [ JwtModule.register({ secret: 'hard!to-guess_secret' })],
  providers: [AuthService],
  exports: [AuthService, JwtService]
})
export class AuthModule {}
  

AuthService:

     import { Injectable } from '@nestjs/common';
import { UsersService } from '../users/users.service';
import { JwtService } from '@nestjs/jwt';

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

  async signPayload (user: any) {
    const payload = { username: 'HARDCORE', color:'RED' };
    return {
      whatever: this.jwtService.sign(payload),
    };
  }
}
  

AppModule:

 @Module({
  imports: [
    ConfigModule.forRoot(),
    JwtModule.registerAsync({
      imports: [ConfigModule],
      useFactory: async (configService: ConfigService) => ({
        secret: 'wefwefwef',
      }),
      inject: [ConfigService],
    }),
    TypeOrmModule.forRoot({
      type: 'mysql',
      ...
    }),
    UsersModule,
    SubscriptionsModule,
    ProductsModule
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {
}
  

someController:

 export class UsersController {
  constructor(private readonly usersService: UsersService,
              private readonly authService: AuthService
  ) {}
...
 @ApiResponse({ status: 401, description: 'Unauthorized.' })
  @ApiResponse({ status: 404, description: 'User Not Found.' })
  @Get('users')
  async findOne(@Query() userGetDto: UserGetDto): Promise<User> {
    const user = await this.usersService.findByUsername(userGetDto.userName);
    if (!user) throw new NotFoundException('User Not Found')
     let signedUser = this.authService.signPayload(user);
    return user;
  

И это ошибка с этой настройкой, которую я получаю:

Nest не может разрешить зависимости JwtService (?). Пожалуйста, убедитесь, что аргумент JWT_MODULE_OPTIONS с индексом [0] доступен в контексте JwtService.

Я трачу много времени на это, но я просто не могу заставить это работать.

Ответ №1:

Судя по вашей ошибке, она где-то JwtService находится в imports массиве. Поставщики (классы, отмеченные @Injectable() ) никогда не попадают в imports массив, а скорее должны быть добавлены в exports массив, и тот модуль, в который exports был добавлен, должен быть помещен в imports массив модуля-потребителя.

Кроме того, если вы работаете с динамическим модулем (любым модулем, который использует register или forRoot или асинхронный вариант из двух), вы всегда должны экспортировать модуль вместо его служб, поскольку модуль, скорее всего, имеет важные конфигурации, необходимые для работы службы.

Комментарии:

1. Я обнаружил проблему. Я опубликую свое решение в надежде, что оно кому-нибудь поможет. Кажется, это довольно обычная проблема для пользователей.