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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 16:45:04