You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:36:02