GraphQL与JavaScript集成报错:RootQueryType必须定义一个或多个字段
解决GraphQL "Type RootQueryType must define one or more fields." 报错
嘿,我一眼就看出问题所在啦!你收到的这个报错,核心原因是你的根查询类型(RootQuery)没有定义任何可被客户端查询的字段——GraphQL要求根查询必须至少包含一个字段,这样客户端才知道能请求哪些数据。
你代码里的const RootQuery...明显是未完成的状态,咱们把它补全就能解决问题了。下面是修复后的完整代码:
const graphql = require('graphql'); const _ = require('lodash'); const { GraphQLObjectType, GraphQLString, GraphQLInt, GraphQLSchema } = graphql; const users = [ { id: "23", firstName: "Bill", age: 20}, { id: "47", firstName: "Sam", age: 21} ]; const UserType = new GraphQLObjectType({ name: 'User', fields: { id: {type: GraphQLString}, firstName: {type: GraphQLString}, age:{type: GraphQLInt} } }); // 补全根查询类型,定义可查询的字段 const RootQuery = new GraphQLObjectType({ name: 'RootQueryType', fields: { // 定义一个名为user的查询字段,根据id获取单个用户 user: { type: UserType, // 这个查询接受的参数 args: { id: { type: GraphQLString } }, // 解析函数:根据参数从数据源获取数据 resolve(parent, args) { // 使用lodash的find方法从users数组中匹配id对应的用户 return _.find(users, { id: args.id }); } } } }); // 最后导出Schema,关联根查询 module.exports = new GraphQLSchema({ query: RootQuery });
关键修复点说明:
- 我们给
RootQuery添加了user字段,指定它返回UserType类型的数据,并且接受一个id参数。 resolve函数是GraphQL的核心,它负责从你的数据源(这里是users数组)中获取对应的数据,我们用lodash的find方法来匹配用户ID。- 最后一定要把
RootQuery关联到GraphQLSchema的query属性上,这样GraphQL才能识别根查询。
测试示例
现在你可以用类似这样的查询语句来测试:
{ user(id: "23") { firstName age } }
这个查询会返回ID为23的用户的名字和年龄。
内容的提问来源于stack exchange,提问作者Nicole Marie
相关产品推荐
相关产品推荐

