Resolver返回空数组原因不明:createPost插入记录后返回空引发非空字段报错
问题原因
你遇到的报错核心是INSERT操作的返回值不符合GraphQL schema中Post类型的结构要求:
- 绝大多数SQL数据库的原生INSERT语句默认仅返回操作元数据(比如影响行数、插入记录的自增ID),不会直接返回插入的整条记录
- 你现在直接把
query方法执行INSERT的返回值返回给GraphQL,这个返回值要么是空数组,要么是仅包含操作信息的对象,没有text、user_id这些Post类型要求的字段,触发非空字段校验失败。
解决方案
根据你使用的数据库类型调整SQL语句,拿到插入的完整记录再返回:
情况1:使用PostgreSQL
PostgreSQL支持INSERT语句后加RETURNING子句直接返回插入的记录,修改代码如下:
import { query } from "@/server/db"; export const createPost = async (_, { post }) => { const insertResult = await query( ` INSERT INTO posts (text, user_id) VALUES (?, ?) RETURNING * `, [post.text, post.user_id] ); // query方法返回的结果是数组,取第一条就是插入的完整记录 return insertResult[0]; };
情况2:使用MySQL/SQLite
这类数据库不支持RETURNING语法,需要在插入后额外查询一次刚插入的记录:
import { query } from "@/server/db"; export const createPost = async (_, { post }) => { // 第一步:执行插入操作 const insertResult = await query( ` INSERT INTO posts (text, user_id) VALUES (?, ?) `, [post.text, post.user_id] ); // 取插入记录的自增ID,不同驱动的字段名可能有差异,可打印insertResult确认 const newPostId = insertResult.insertId ?? insertResult.lastInsertRowid; // 第二步:查询刚插入的完整记录 const newPost = await query(`SELECT * FROM posts WHERE id = ?`, [newPostId]); return newPost[0]; };
额外注意
- 如果你使用的是Prisma、TypeORM这类ORM工具,内置的create方法默认就会返回插入的完整记录,不需要手动编写两次查询逻辑
- 修改前可以先打印INSERT操作的返回结果,确认你所用数据库驱动的返回结构,调整字段取值逻辑
内容的提问来源于stack exchange,提问作者A.K.M. Adib
相关产品推荐
相关产品推荐

