Nest can't resolve dependencies of the USERRepository

15,011

Solution 1

Problem

The problem is that you're assigning a name to your database in the root import:

imports: [TypeOrmModule.forRoot({
      "type":"postgres",
      "name":"pm_main",
      ^^^^^^^^^^^^^^^^^
      "host": "localhost",
      "port": 5432,
      "username": "postgres",
      "password": "test",
      "database": "test",
      "synchronize":true
  }

But then you don't use the same name in the forFeature import:

imports: [TypeOrmModule.forFeature([USER])],


Solution

a) So either add the name to the forFeature import:

TypeOrmModule.forFeature([USER], 'pm_main')

b) or remove the "name":"pm_main", from your forRoot import. If you only have one database you can just rely on the implicit default name.

Solution 2

Kim's solution doesn't completely solve the problem when there are multiple databases in use.

finally solve it when check out this issue. https://github.com/nestjs/typeorm/issues/105

That is, also need to specify the connection name when @InjectRepositry(Model, connectionName)

Solution 3

Hope this help.

import { UserEntity } from './user.entity';
import { TypeOrmModule } from '@nestjs/typeorm';
const module = await Test.createTestingModule({
    controllers: [UsersController],
    providers: [UsersService],
    imports: [TypeOrmModule.forRoot(), TypeOrmModule.forFeature([UserEntity])], // <== This line
}).compile();
Share:
15,011
Admin
Author by

Admin

Updated on August 03, 2022

Comments

  • Admin
    Admin almost 2 years

    This is really an unexpected problem.

    When I type in the terminal "npm run start", there's an error.

    [Nest] 40671   - 2018-10-20 17:46:37   [ExceptionHandler] Nest can't resolve dependencies of the USERRepository (?). Please make sure that the argument at index [0] is available in the current context. +22ms
    Error: Nest can't resolve dependencies of the USERRepository (?). Please make sure that the argument at index [0] is available in the current context.
        at Injector.lookupComponentInExports (/Users/huxiao/OneDrive/Coding/wtapm/node_modules/@nestjs/core/injector/injector.js:139:19)
        at <anonymous>
        at process._tickCallback (internal/process/next_tick.js:160:7)
        at Function.Module.runMain (module.js:703:11)
        at Object.<anonymous> (/Users/huxiao/OneDrive/Coding/wtapm/node_modules/ts-node/src/_bin.ts:177:12)
        at Module._compile (module.js:660:30)
        at Object.Module._extensions..js (module.js:671:10)
        at Module.load (module.js:573:32)
        at tryModuleLoad (module.js:513:12)
        at Function.Module._load (module.js:505:3)
     1: node::Abort() [/usr/local/bin/node]
     2: node::Chdir(v8::FunctionCallbackInfo<v8::Value> const&) [/usr/local/bin/node]
     3: v8::internal::FunctionCallbackArguments::Call(void (*)(v8::FunctionCallbackInfo<v8::Value> const&)) [/usr/local/bin/node]
     4: v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::FunctionTemplateInfo>, v8::internal::Handle<v8::internal::Object>, v8::internal::BuiltinArguments) [/usr/local/bin/node]
     5: v8::internal::Builtin_Impl_HandleApiCall(v8::internal::BuiltinArguments, v8::internal::Isolate*) [/usr/local/bin/node]
     6: 0x909046042fd
    Abort trap: 6
    

    I tried everything I can do, but I couldn't solve it. My codes are as below:

    below is [app.module.ts]

    import { Module } from '@nestjs/common';
    import { AppController } from './app.controller';
    import { AppService } from './app.service';
    import { UserModule } from './user/user.module';
    import {TypeOrmModule} from '@nestjs/typeorm';
    
    @Module({
      imports: [TypeOrmModule.forRoot(
    {
          "type":"postgres",
          "name":"pm_main",
          "host": "localhost",
          "port": 5432,
          "username": "postgres",
          "password": "test",
          "database": "test",
          "synchronize":true
      }
      ),UserModule],
      controllers: [AppController],
      providers: [AppService]
    })
    export class AppModule {}
    

    Below is [user.service.ts]

    import { Injectable } from '@nestjs/common';
    import { InjectRepository } from '@nestjs/typeorm';
    import { USER } from './models/user.model';
    import { Repository } from 'typeorm';
    
    @Injectable()
    export class UserService {
    
        constructor(
            @InjectRepository(USER)
            private readonly userRepository: Repository<USER>
        ){}
    
        async findAllUser(): Promise<USER[]> {
            return await this.userRepository.find();
        }
    }
    

    Below is [user.module.ts]

    import { Module } from '@nestjs/common';
    import { UserController } from './user.controller';
    import { UserService } from './user.service';
    import { PROJECT } from 'project/models/project.model';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { USER } from './models/user.model';
    
    @Module({
      imports: [TypeOrmModule.forFeature([USER])],
      providers: [UserService],
      controllers: [UserController],
      exports: [UserService]
    })
    export class UserModule {}
    

    I 100% followed the sample of the document, but it seems not right.

    For more information, the dependencies in package.json are as below:

    "dependencies": {
        "@nestjs/common": "^5.3.9" 
        "@nestjs/core": "^5.3.10", 
        "@nestjs/typeorm": "^5.2.0",
        "ajv": "^6.5.4",
        "class-validator": "^0.9.1",
        "fastify-formbody": "^2.0.0",
        "jsonwebtoken": "^8.3.0",
        "passport": "^0.4.0",
        "passport-jwt": "^4.0.0",
        "pg": "^7.4.3",
        "reflect-metadata": "^0.1.12",
        "rxjs": "^6.0.0",
        "typeorm": "^0.2.7",
        "typescript": "^2.6.2"
    

    Also [user.model.ts] as USER is shown below

    import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToMany, JoinTable } from "typeorm";
    import { IsNotEmpty, IsDate, IsEmail, IsArray, IsEnum, IsJSON } from 'class-validator'
    import { user_Gender, user_Status } from "./user.enum";
    import { PROJECT } from 'project/models/project.model';
    
    @Entity()
    export class USER {
        @PrimaryGeneratedColumn('uuid')
        id:string;
    
        @Column({unique:true})
        @IsNotEmpty()
        username:string;
    
        @Column()
        password:string;
    
        @Column()
        @IsEnum({user_Gender})
        gender:string;
    
        @Column("jsonb")
        @IsJSON()
        realname?:{
            firstName:string;
            lastName:string;
            middleName:string;
        };
    
        @Column()
        @IsDate()
        birthday?:Date;
    
        @CreateDateColumn()
        createAt:Date;
    
        @UpdateDateColumn()
        updateAt:Date;
    
        @Column()
        @IsArray()
        industry?:string[];
    
        @Column()
        @IsEmail()
        email?:string;
    
        @Column()
        @IsArray()
        org?:string[];
    
        @Column()
        current_org?:string;
    
        @Column("jsonb")
        @IsJSON()
        user_location?:{
            country:string;
            province_or_state:string;
            city:string;
            district:string;
            address:string;
        };
    
        @Column("jsonb")
        @IsJSON()
        mobilephone?:{code:string,number:string};
    
        @Column("text")
        avater:string;
    
        @Column()
        @IsArray()
        receive_account?:[{
            name:string,
            number:string,
            bank:string,
            swiftCode?:string,
            address?:string}]
    
        @Column()
        @IsDate()
        last_loginAt?:Date;
    
        @Column()
        @IsEnum(user_Status)
        status:string;
    
        @Column()
        projectsId:[];
    
        @ManyToMany(type => PROJECT, project => project.members)
        @JoinTable()
        projects:PROJECT[];
    
    }
    
  • FLoppix
    FLoppix about 5 years
    Thanks ! Was stuck for hours because I had the same issue.
  • Adeel Shekhani
    Adeel Shekhani almost 5 years
    I am facing this issue.I have two databases, already adding the name in forFeature but still the same.
  • Simas Joneliunas
    Simas Joneliunas over 4 years
    It would be helpful if you could explain what the code in your answer changes to solve the OP's problem.Code without comments has very little value t oothers
  • Danilo Del Fio
    Danilo Del Fio over 3 years
    Thank you Kim, you made my day!
  • Firmino Changani
    Firmino Changani about 3 years
    Solved my issue with Sequelize.
  • sulaiman sudirman
    sulaiman sudirman about 3 years
    Thanks, even though this doesn't answer the original question, but it gave me the clue to my problem, where i'm getting this error in my test script