@Raey

Nest.js Нужно ли экспортировать PassportModule и JwtStrategy?

Видел множество примеров, кто-то делал так, а кто-то нет. Никак не могу прийти в единому мнению.
Без экспорта PassportModule и JwtStrategy все работает и так.
Пример:
AuthModule
import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersRepository } from './users.repository';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { JwtStrategy } from './jwt.strategy';
import { ConfigModule, ConfigService } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule,
    PassportModule.register(),
    JwtModule.registerAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => ({
        secret: configService.get('JWT_SECRET'),
        signOptions: {
          expiresIn: 3600,
        },
      }),
    }),
    TypeOrmModule.forFeature([UsersRepository]),
  ],
  providers: [AuthService, JwtStrategy],
  controllers: [AuthController],
  exports: [JwtStrategy, PassportModule],
})
export class AuthModule {}

TaskModule
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TasksController } from './tasks.controller';
import { TasksRepository } from './tasks.repository';
import { TasksService } from './tasks.service';

@Module({
  imports: [TypeOrmModule.forFeature([TasksRepository])],
  controllers: [TasksController],
  providers: [TasksService],
})
export class TasksModule {}


В Таск Контроллере использую @UseGuards(JwtAuthGuard)
import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}


AppModule
import { Module } from '@nestjs/common';
import { TasksModule } from './tasks/tasks.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AuthModule } from './auth/auth.module';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { configValidationSchema } from './config.schema';

@Module({
  imports: [
    ConfigModule.forRoot({
      validationSchema: configValidationSchema,
    }),
    TasksModule,
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => {

        return {
          type: 'postgres',
          autoLoadEntities: true,
          synchronize: true,
          host: configService.get('DB_HOST'),
          port: configService.get('DB_PORT'),
          username: configService.get('DB_USERNAME'),
          password: configService.get('DB_PASSWORD'),
          database: configService.get('DB_DATABASE'),
        };
      },
    }),
    AuthModule,
  ],
})
export class AppModule {}


Так вот, если в AuthModule я уберу exports: [JwtStrategy, PassportModule], все будет работать, никаких варнов в консоли. Допустимо ли так делать?
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
lssssssssssl
@lssssssssssl
Допустимо.

Но вообще зависит от логики вашего приложения.
Если хотите использовать JwtService в других модулях, тогда вам нужно зарегистрировать JwtModule в одном из своих модулей и экспотировать его.
Смысл этого в том, чтобы один раз в приложении вызвать метод registerAsync() и переиспользовать этот же модуль с этим выполненным методом в других модулях.

Но лично я не советую вам делать экспорт конкретно из AuthModule, потому что AuthModule наоборот должен импортировать другие модули в себя, а не быть импортом для кого-то.

С PassportModule аналогично. Но лично я всегда храню его в AuthModule и никуда не экспортирую, и больше нигде не использую.
Экспортировать JwtStrategy нет смысла, так как единственное место, где вы её используете, это в JwtAuthGuard.

Подведя итог: Можно экспотировать, но чаще всего не нужно( Я за 2 года не встретил ещё такой надобности )
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы