为何该GraphQL查询返回null?附相关Schema代码片段
为什么你的GraphQL查询返回null?
咱们先从你给出的不完整代码入手,结合GraphQL的工作逻辑,最可能的原因集中在以下几个方面:
1. RootQuery里的user字段定义不完整(最可能的原因)
你提供的代码里RootQueryType的fields中user...明显没写完——GraphQL的字段必须指定type,并且如果要返回具体数据,必须有resolve函数来对接数据源。
举个正确的写法参考:
const RootQueryType = new GraphQLObjectType({ name: 'RootQuery', fields: { user: { // 指定返回类型为UserType type: UserType, // 定义查询需要的参数(比如根据id查用户) args: { id: { type: GraphQLString } }, // 核心:resolve函数负责从数据源(这里是users数组)获取数据 resolve(parent, args) { // 用lodash的find方法根据id匹配用户 return _.find(users, { id: args.id }); } } } });
如果缺少resolve函数,或者resolve里没有正确返回匹配的用户数据,查询自然会返回null。
2. 查询时未传入必要的参数
假设你的user查询需要id参数来定位用户,但你发起的查询没有传这个参数,比如:
# 错误的查询:没传id参数 query { user { id firstName } }
这时候resolve函数里的args.id是undefined,_.find找不到匹配的用户,就会返回null。正确的查询应该带上id:
# 正确的查询:传入id参数 query { user(id: "23") { id firstName } }
3. 数据类型不匹配导致查找失败
你的users数组里的id是字符串类型(比如'23'),如果查询时传入的是数字类型的23,或者resolve里的匹配逻辑用了数字对比,就会因为类型不匹配找不到数据,返回null。这时候要确保参数类型和数据源里的类型一致,或者在resolve里做类型转换(比如把args.id转成字符串)。
4. 未正确导出GraphQL Schema
最后别忘了,必须把定义好的RootQueryType作为查询入口传入GraphQLSchema并导出,否则你的查询找不到对应的根查询入口,也会返回null:
// 正确导出Schema module.exports = new GraphQLSchema({ query: RootQueryType });
你可以先检查这几个点,尤其是RootQuery里user字段的完整定义,应该就能解决返回null的问题了。
内容的提问来源于stack exchange,提问作者afkbowflexin
相关产品推荐
相关产品推荐

