Nest JS & TypeORM cannot use findOne properly

Viewed 2870

I am trying to get a user instance based on id (same happens for other attributes such as email. Inside the Service, this is my code:

@Injectable()
export class UserService {
  @InjectRepository(User)
  private readonly repository: Repository<User>;

  async findOne(id: number): Promise<User> {
    const user = await this.repository.findOne(id);
    return user;
  }
}

and my User entity is:

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  public id: number;

  @Column({ type: 'varchar', length: 120 })
  public name: string;

  @Column({ type: 'varchar', length: 120 })
  public email: string;
}

The problem is that I always get this error: src/api/user/user.service.ts - error TS2559: Type 'number' has no properties in common with type 'FindOneOptions<User>'.

Other methods such as getAll work just fine:

public getAllUsers(): Promise<User[]> {
  return this.repository.find();
}
5 Answers

There are some breaking changes in typeorm. I wouldn't suggest downgrading, instead check the latest methods.

findOne(id); is now changed to

findOneBy({
id: id // where id is your column name
})

And find() is now

find({
  select: {
    id: true,
    email: true,
    password: true,
  },
});

Please check this link for more information.

check-in your package.json file and replace your version of typeorm with this one "typeorm": "^0.2.34"

the problem is the typeorm version , try typeorm version 0.2.25 and it will be works

Actually you don't need to downgrade the typeorm package. Just changed to findOne by this:

async findOne(id: number): Promise<User> {
    const user = await this.repository.findOne({
           where: { id }
    });
    return user;
}
Related