在Node.js中正确定义graphQLSchema

时间:2017-07-11 09:56:52

标签: facebook-graph-api graphql graphql-js

第一次做graphQL。我搜索了资源但找不到有用的资源。 我编写了以下架构,从另一个stackoverflow帖子获得了一些帮助。

schema.js

function getDataFromUrl(){
    return [
                {
                    "EventCode": "ET00029280",
                    "EventType": "CT",
                    "EventTitle": "OYSTERS Beach Park",
                    "VenueName": "Newexcelsior",
                    "VenueRegion": "Mumbai"
                },
                {
                    "EventCode": "ET00030629",
                    "EventType": "CT",
                    "EventTitle": "Stand-Up Comedy: The Trial Room",
                    "VenueName": "Newexcelsior",
                    "VenueRegion": "Mumbai"
                }
    ];
}

const eventType = new GraphQLObjectType({
  name: 'Event',
  fields: {
    EventTitle: {
      type: GraphQLString,
      description: 'Event Title'

    },
  },
});

const eventListType = new GraphQLObjectType({
  name: 'EventList',
  fields: {
    events: {
      type: new GraphQLList(eventType),
      description: 'List of items',
    },
  },
});

const schema = new GraphQLSchema({
    query: new GraphQLObjectType({
        name: 'Query',
        fields: {
           eventList: {
                type: new GraphQLList(eventListType),
                resolve: () =>  getDataFromUrl(),
           }
        }
    })
});

module.exports = schema;

当我查询

{
  eventList {
    events {
      EventTitle
    }
  }
}

我收到了这个回复:

{
  "data": {
    "eventList": [
      {
        "events": null
      },
      {
        "events": null
      }
    ]
  }
}

我期待我的架构有一些变化,但是我想要的回应是

{
  "data": [
    {
      "EventTitle": "OYSTERS Beach Park"
    },
    {
      "EventTitle": "Stand-Up Comedy: The Trial Room"
    }
  ]
}

还请提供一些我学习基础知识的链接。

1 个答案:

答案 0 :(得分:1)

现在看起来最让你吵架的是你如何定义一个列表。没有必要定义一个名为EventList的单独类型 - 当您指定GraphQLList(someOtherType)时,您已经告诉GraphQL期望该特定类型的数组。您当前的Schema期望一个类型数组的数组。由于您传入的数据结构与您的架构不匹配,因此GraphQL无法找到一个名为EventTitle的字段来匹配,因此它返回null。

此案例中的解决方法是完全删除eventListType并将type字段的eventList改为eventType

对于GraphQL.js来说,

The docs可能是学习基础知识的最佳选择。唯一的问题是它们包含的例子太基本了。这是GitHub上的list of projects,您可以签出以查看GraphQL的运行情况。

如果你刚开始,我也 高度 推荐使用Apollo的graphql-tools。即使您不在客户端使用Apollo,graphql-tools也可以轻松地设置服务器。您的模式将更具可读性,因为您将其写为字符串而不是像在vanilla GraphQL.js中那样的对象。除了GraphQL之外,您还可以轻松设置GraphiQL endpoint,这使调试变得更加容易:)