NestJS模块导出报错:无法导出未纳入模块的Provider,求解决方案
NestJS报错修复:无法导出未归属当前模块的Provider
报错信息
ERROR [ExceptionHandler] Nest cannot export a provider/module that is not a part of the currently processed module (ClassesModule). Please verify whether the exported ClassService is available in this particular context.
问题根源
- ClassesModule配置错误:你在
ClassesModule的exports数组中声明要导出ClassService,但该Service并未被添加到模块的providers数组中,NestJS不允许导出不属于当前模块的Provider。 - 控制器位置错误:
ClassesModule中将ClassController放在了providers数组,控制器必须归属于controllers数组。 - AppModule重复声明:
AppModule同时导入ClassesModule并在自身providers中声明ClassService,会导致Service重复实例化,违反模块单一职责原则。
修复步骤
1. 修正ClassesModule
将控制器移到正确的数组,并把ClassService加入providers以支持导出:
/* eslint-disable prettier/prettier */ import { MongooseModule } from '@nestjs/mongoose'; import { Class, ClassSchema } from 'src/model/class.schema'; import { ClassService } from 'src/services/class.service'; import { Module } from '@nestjs/common'; import { User, UserSchema } from 'src/user/model/user.schema'; import { Homework, HomeworkSchema } from 'src/model/homework.schema'; import { ClassController } from 'src/controllers/class.controller'; @Module({ imports: [ MongooseModule.forFeature([{ name: Class.name, schema: ClassSchema }]), MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]), MongooseModule.forFeature([ { name: Homework.name, schema: HomeworkSchema }, ]), ], controllers: [ClassController], // 控制器移至此处 providers: [ClassService], // 添加ClassService到providers exports: [ClassService], // 现在可合法导出 }) export class ClassesModule {}
2. 修正AppModule
移除重复声明的ClassController和ClassService,由ClassesModule统一管理:
/* eslint-disable prettier/prettier */ import { Module } from '@nestjs/common'; import { AppService } from './app.service'; import { ServeStaticModule } from '@nestjs/serve-static'; import { join } from 'path'; import { MongooseModule } from '@nestjs/mongoose'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { UserController } from './user/user.controller'; import { AuthModule } from './auth/auth.module'; import { UsersModule } from 'src/user/user.module'; import { EmailConfirmationController } from './email/emailConfirmation.controller'; import EmailService from './email/email.service'; import { EmailConfirmationService } from './email/emailConfirmation.service'; import { EmailModule } from './email/email.module'; import { JwtModule } from '@nestjs/jwt'; import { ClassesModule } from './modules/class.module'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), ServeStaticModule.forRoot({ rootPath: join(__dirname, '..', 'public'), }), MongooseModule.forRootAsync({ imports: [ConfigModule], useFactory: async (configService: ConfigService) => ({ uri: configService.get<string>('MONGODB_URI') }), inject: [ConfigService], }), AuthModule, UsersModule, EmailModule, ClassesModule, JwtModule.register({}), ], controllers: [UserController, EmailConfirmationController], // 移除ClassController providers: [AppService, EmailConfirmationService, EmailService], // 移除ClassService }) export class AppModule {}
3. EmailModule无需修改
EmailModule已正确导入ClassesModule,可直接使用ClassService,无需额外调整。
内容的提问来源于stack exchange,提问作者Châu Đặng
相关产品推荐
相关产品推荐

