Reputation: 69
Error: Nest can't resolve dependencies of the StatusService (?). Please make sure that the argument "StatusEntityRepository" at index [0] is available in the StatusModule context.
StatusModule:
import { Module } from '@nestjs/common';
import { StatusPersistenceModule } from './persistence/status-persistence.module';
import { StatusService } from './status.service';
@Module({
imports: [StatusPersistenceModule],
providers: [StatusService],
exports: [StatusService],
})
export class StatusModule {}
StatusPersistenceModule:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { StatusRepository } from './status-repository.interface';
import { StatusEntity } from './status.entity';
import { StatusRepositoryImpl } from './status.repository';
@Module({
imports: [TypeOrmModule.forFeature([StatusEntity])],
providers: [
{
provide: StatusRepository,
useClass: StatusRepositoryImpl,
},
],
exports: [StatusRepository],
})
export class StatusPersistenceModule {}
StatusService:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Nullable } from 'src/common/types/nullable.type';
import { EntityCondition } from 'src/common/types/entity-condition.type';
import { StatusEntity } from './persistence/status.entity';
import { StatusRepository } from './persistence/status-repository.interface';
@Injectable()
export class StatusService {
constructor(
@InjectRepository(StatusEntity)
private readonly statusRepository: StatusRepository,
) {}
async findOne(
fields: EntityCondition<StatusEntity>,
): Promise<Nullable<StatusEntity>> {
return this.statusRepository.findOne(fields);
}
}
This StatusModule
is used in UserModule
:
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { RoleModule } from '../role/role.module';
import { StatusModule } from '../status/status.module';
import { UserPersistenceModule } from './persistence/user-persistence.module';
@Module({
imports: [RoleModule, StatusModule, UserPersistenceModule],
controllers: [UserController],
providers: [UserService],
exports: [UserService],
})
export class UserModule {}
AppModule:
import { Module } from '@nestjs/common';
import { AuthModule } from './modules/auth/auth.module';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TypeOrmConfigService } from './database/typeorm-config.service';
import { DataSource, DataSourceOptions } from 'typeorm';
import appConfig from './config/app.config';
import databaseConfig from './database/config/database.config';
import authConfig from './modules/auth/config/auth.config';
import { UserModule } from './modules/user/user.module';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
load: [appConfig, databaseConfig, authConfig],
envFilePath: ['.env'],
}),
TypeOrmModule.forRootAsync({
useClass: TypeOrmConfigService,
dataSourceFactory: async (options: DataSourceOptions) => {
return new DataSource(options).initialize();
},
}),
AuthModule,
UserModule,
],
})
export class AppModule {}
Putting StatusModule
in the AppModule
imports
does nothing.
Does anyone know why Nest can't resolve the StatusRepository
injection in the StatusService
? Thanks
Upvotes: 0
Views: 105
Reputation: 6695
looks like you're using a wrong token provider for that private readonly statusRepository: StatusRepository
The @InjectRepository(StatusEntity)
implies in an injecting the provider registered by TypeOrmModule.forFeature([StatusEntity])
(under the token "StatusEntityRepository"
), not the StatusRepository
class you've registered yourself at StatusPersistenceModule
. It is the same as doing:
@Inject("StatusEntityRepository")
private readonly statusRepository: StatusRepository,
which is clearly wrong as the StatusPersistenceModule
didn't export that provider.
I didn't follow what you're trying to do.
Upvotes: 0