为什么我的GraphQL查询返回空数组但控制台没报错?

彤彤酱~ 阅读 14

我用Apollo Server写了一个GraphQL接口,查询数据库里的文章列表时,控制台显示数据正常获取到了,但前端请求却返回空数组。数据库连接和查询语句都检查过没问题,甚至连console.log(result)都显示有数据。

这是我的resolver代码:


const resolvers = {
  Query: {
    articles: async () => {
      const result = await db.query('SELECT * FROM articles');
      console.log(result); // 这里输出了正确的数据
      return result;
    }
  }
};
</pre>
</p>

<p>但前端用这个查询:
<pre class="pure-highlightjs line-numbers"><code class="language-graphql">
query {
  articles {
    id
    title
    content
  }
}
</pre>
</p>

<p>返回的却是:
<pre class="pure-highlightjs line-numbers"><code class="language-json">
{
  "data": {
    "articles": []
  }
}

数据库里的字段明明是id、title、content,完全匹配schema定义,到底是哪里出问题了?

我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
峻豪~
峻豪~ Lv1
这问题我之前在WP里面搞Headless的时候也踩过。表面看是GraphQL返回空数组,其实大概率是resolver返回的数据格式和GraphQL Schema对不上。

你虽然数据库查到了数据,console.log也看到了,但注意:MySQL的驱动比如mysql2,默认返回的是数组套对象,而Apollo的resolver期望的是纯对象数组,并且字段要能匹配你的typeDefs。

重点查这几个地方:

第一个,看看你db.query返回的是不是 result[0] 这种嵌套结构。很多MySQL库实际返回的是 [rows, fields],你得取 result[0] 才是真正的数据。你log出来的可能是整个结果元组,但resolver return的却是没拆包的,GraphQL就认为没数据。

改成这样试试:

const resolvers = {
Query: {
articles: async () => {
const [rows] = await db.query('SELECT * FROM articles'); // 注意解构
console.log(rows); // 确认这里才是真实数据
return rows;
}
}
}


第二个,检查你的GraphQL typeDef有没有定义对字段类型。比如你定义了非空但数据库有null值,也可能导致字段被过滤掉变成空。

还有个小概率情况是字段大小写问题,MySQL在某些系统下字段会变成小写,但你的SDL里写的是大写,中间没做映射,也会丢数据。建议在SQL里用 AS 显式别名,比如 SELECT id as id, title as title 强制一致。

先从解构 [rows] 开始改,90%是这个坑。
点赞 3
2026-02-11 22:08