为什么我的GraphQL查询返回空数组但控制台没报错?
我用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定义,到底是哪里出问题了?
你虽然数据库查到了数据,console.log也看到了,但注意:MySQL的驱动比如mysql2,默认返回的是数组套对象,而Apollo的resolver期望的是纯对象数组,并且字段要能匹配你的typeDefs。
重点查这几个地方:
第一个,看看你db.query返回的是不是
result[0]这种嵌套结构。很多MySQL库实际返回的是[rows, fields],你得取result[0]才是真正的数据。你log出来的可能是整个结果元组,但resolver return的却是没拆包的,GraphQL就认为没数据。改成这样试试:
第二个,检查你的GraphQL typeDef有没有定义对字段类型。比如你定义了非空但数据库有null值,也可能导致字段被过滤掉变成空。
还有个小概率情况是字段大小写问题,MySQL在某些系统下字段会变成小写,但你的SDL里写的是大写,中间没做映射,也会丢数据。建议在SQL里用 AS 显式别名,比如
SELECT id as id, title as title强制一致。先从解构
[rows]开始改,90%是这个坑。