NestJS结合Prisma创建带关联地址字段的用户记录报错如何解决?
问题排查与修正方案
核心错误点
- 嵌套创建关联写法错误:你的Prisma Schema定义中,单个
user只能关联一个addresses,属于多对一关联。你代码中address.create: [ {...} ]的数组写法仅适用于创建多个关联记录的一对多场景,这里需要去掉数组直接传对象。 - 字段类型不匹配:Schema中
addresses.number字段类型为String,但DTO中address.number定义为number类型,类型不匹配会触发Prisma校验报错。 - 变量名不规范(非报错原因):你创建用户的返回值变量命名为
createCategory,属于笔误,建议修正避免后续代码维护混淆。
修正后的代码
Service代码
async create(createUserDto: CreateUserDto) { const hash = crypto.SHA256(createUserDto.password); const passwordHash = hash.toString(crypto.enc.Hex).toUpperCase(); const createdUser = await this.client.user.create({ data: { name: createUserDto.name, email: createUserDto.email, age: createUserDto.age, password: passwordHash, roleId: createUserDto.roleId, address: { // 去掉数组包裹,直接传入地址对象 create: { street: createUserDto.address.street, // 转为字符串匹配Schema定义,如果业务需要数值可以把Schema中addresses.number改为Int类型 number: String(createUserDto.address.number), complement: createUserDto.address.complement, neighborhood: createUserDto.address.neighborhood, cityId: createUserDto.address.cityId, stateId: createUserDto.address.stateId, zipcode: createUserDto.address.zipcode }, }, }, }) return createdUser; }
DTO可选优化
嵌套创建用户和地址的场景下不需要传入addressId,可以标记为可选字段:
export class CreateUserDto { readonly id: number readonly name :string readonly age :any readonly email :any readonly password :any readonly roleId :any readonly addressId?: number readonly address: { street: string, number: number, complement: string, neighborhood: string, cityId: number, stateId: number, zipcode: string } }
内容的提问来源于stack exchange,提问作者Italo Gama
相关产品推荐
相关产品推荐

