NestJS GraphQL开发时id与productsWhereUniqueInput类型不兼容报错如何解决
问题根因
你遇到的报错由两个核心问题叠加导致:
- Prisma 生成的
productsWhereUniqueInput类型要求传入包含id字段的对象,而非直接传入id值 - GraphQL 标准的
ID标量默认会被生成为string类型,但你Prisma模型中id字段是Int数值类型,两者类型不匹配 - 额外注意:你GraphQL类型中定义了Prisma模型不存在的
category_id字段,直接透传会触发Prisma入参校验错误
解决方案
按以下步骤调整即可修复问题:
1. 临时修复(直接解决当前报错)
修改resolver层的调用逻辑,手动处理类型转换和参数格式:
@Mutation('updateProduct') update(@Args('updateProductInput') updateProductInput: UpdateProductInput) { // 转换id类型并包装为Prisma要求的where对象 const where = { id: Number(updateProductInput.id) } // 剔除Prisma不存在的字段,避免校验报错 const { id, category_id, ...updateData } = updateProductInput return this.productService.update(where, updateData) }
2. 根源修复(避免后续重复出现类型问题)
修改GraphQL类型生成配置,将ID标量直接映射为number类型,修改generate-typings文件的配置:
definitionsFactory.generate({ typePaths: ['./src/**/*.graphql'], path: join(process.cwd(), 'src/graphql.ts'), outputAs: 'class', customScalarTypeMapping: { DateTime: 'Date', ID: 'number', // 新增该行,指定GraphQL的ID类型生成number类型 }, emitTypenameField: true, });
重新执行类型生成后,UpdateProductInput中的id字段会自动变为number类型,无需再手动做类型转换。
3. 可选优化
- 你Prisma模型中的
name、description、price等字段为可选类型,但GraphQL类型中设为了非空,建议保持两边一致,避免运行时报错 created_at、updated_at字段建议在Prisma模型中配置@updatedAt、@default(now())自动维护,无需在更新入参中让用户传入,可直接从UpdateProductInput中移除
内容的提问来源于stack exchange,提问作者niels van hoof
相关产品推荐
相关产品推荐

