mmozedev
mmozedev

Reputation: 69

Nest can't resolve dependencies of a service

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

Answers (1)

Micael Levi
Micael Levi

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

Related Questions