NestJS开发CRUD时遇No overload matches this call错误求助
问题:TypeORM中调用
user.save()时出现类型错误 我正在学习用JavaScript开发CRUD操作,在users.service文件的await user.save()代码处遇到两个错误:
No overload matches this call。Overload 1 of 3, '(this: (new () => User) & typeof BaseEntity, entityLikeArray: DeepPartial[]): User[]', gave the following error.Property 'save' does not exist on type 'User[]'.
相关代码
users.service.ts
import { CreateUserDto } from './dto/create-user.dto'; import { User } from './user.entity'; @Injectable() export class UsersService { async create(createUserDto: CreateUserDto) { const user = User.create(createUserDto); await user.save(); delete user.password; return user; } }
create-user.dto.ts
import { IsEmail, IsNotEmpty } from "class-validator"; export class CreateUserDto{ @IsEmail() email: string; @IsNotEmpty() password:string; }
users.controller.ts
export class UsersController { constructor(private readonly usersService: UsersService) {} @Post() create(@Body() createUserDto: CreateUserDto) { return this.usersService.create(createUserDto); } }
users.entity.ts
import { BaseEntity, BeforeInsert, Column, CreateDateColumn, PrimaryGeneratedColumn, UpdateDateColumn } from "typeorm"; import * as bcrypt from 'bcryptjs'; export class User extends BaseEntity { @PrimaryGeneratedColumn() id: number; @Column() email: string; @Column() password: string; @Column() @CreateDateColumn() createdAt: Date; @Column() @UpdateDateColumn() updatedAt: Date; @BeforeInsert() async hashPassword() { this.password = await bcrypt.hash(this.password, 8); } async validatePassword(password: string): Promise<boolean> { return bcrypt.compare(password, this.password); } }
解决方案
错误原因
User.create()方法的类型推断出现问题:当传入单个对象时,TypeORM错误地将返回值推断为User[]类型,而不是单个User实例。数组没有save()方法,因此触发报错。
修复方式1:显式指定类型
给user变量添加类型注解,强制指定为User类型:
async create(createUserDto: CreateUserDto) { const user: User = User.create(createUserDto) as User; await user.save(); delete user.password; return user; }
修复方式2:使用Repository操作(推荐)
通过TypeORM的Repository来创建和保存实体,这种方式类型推断更可靠,也是NestJS+TypeORM的标准用法:
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { CreateUserDto } from './dto/create-user.dto'; import { User } from './user.entity'; @Injectable() export class UsersService { constructor( @InjectRepository(User) private userRepository: Repository<User>, ) {} async create(createUserDto: CreateUserDto) { const user = this.userRepository.create(createUserDto); await this.userRepository.save(user); delete user.password; return user; } }
额外提醒:确保你的User实体已正确注册到TypeORM的数据源配置中,否则可能影响类型识别和数据库操作。
内容的提问来源于stack exchange,提问作者Dava Eranda
相关产品推荐
相关产品推荐

