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

GraphQL突变报错但仍更新PostgreSQL数据库问题求助

问题解决:Cannot return null for non-nullable field Evaluator.performanceExp

问题根源

PostgreSQL返回的查询结果字段是下划线命名(如performance_exp),但你的GraphQL Evaluator类型定义使用小驼峰命名(如performanceExp)。Resolver执行INSERT后直接返回数据库结果时,字段名不匹配,GraphQL无法找到对应小驼峰字段,判定该字段为null,触发非空约束错误。静态赋值正常是因为你直接返回了符合类型定义的小驼峰字段。

解决方案

1. 手动映射字段名

在Resolver中,将数据库返回的下划线字段手动转换为小驼峰后返回:

// 假设使用pg库执行查询
const { rows } = await pool.query(
  'INSERT INTO tb_evaluator (performance_exp, app_exp) VALUES ($1, $2) RETURNING *',
  [performanceExp, appExp]
);
const dbEvaluator = rows[0];

// 手动转换字段名后返回
return {
  id: dbEvaluator.id,
  performanceExp: dbEvaluator.performance_exp,
  appExp: dbEvaluator.app_exp,
  // 其他字段依次映射
};

2. 工具批量转换字段名

使用lodash.camelCase或类似工具批量转换对象键名,减少重复代码:

const _ = require('lodash');

// ...查询逻辑
const dbEvaluator = rows[0];
// 将所有下划线键转为小驼峰
return _.mapKeys(dbEvaluator, (val, key) => _.camelCase(key));

3. SQL查询中指定别名

在INSERT的RETURNING子句里给字段起小驼峰别名,让数据库直接返回匹配的字段名:

INSERT INTO tb_evaluator (performance_exp, app_exp) VALUES ($1, $2)
RETURNING 
  id,
  performance_exp AS "performanceExp",
  app_exp AS "appExp"
  -- 其他字段同理

注意PostgreSQL中大小写敏感的别名需要用双引号包裹。

4. 使用ORM自动处理映射

如果项目规模较大,推荐使用Prisma、TypeORM这类ORM工具,它们会自动处理数据库下划线命名到GraphQL小驼峰的映射,无需手动转换字段名。

内容的提问来源于stack exchange,提问作者Hid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:33:15