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
相关产品推荐
相关产品推荐

