我尝试使用中继实现连接,并且所有节点的ID都相同

时间:2015-12-26 08:29:56

标签: reactjs relay graphql

我使用graphql编写了一个非常简单的模式,但是边缘中的所有ID都是相同的。

{
    "data": {
        "imageList": {
            "id": "SW1hZ2VMaXN0Og==",
            "images": {
                "edges": [
                  {
                      "node": {
                          "id": "SW1hZ2U6",
                          "url": "1.jpg"
                      }
                  },
                  {
                      "node": {
                          "id": "SW1hZ2U6",
                          "url": "2.jpg"
                      }
                  },
                  {
                      "node": {
                          "id": "SW1hZ2U6",
                          "url": "3.jpg"
                      }
                  }
                ]
            }
        }
    }
}

我在github上发布了具体细节,这里是link

2 个答案:

答案 0 :(得分:7)

因此,globalIdField希望您的对象具有名为“id”的字段。然后它将您传递给globalIdField的字符串添加一个':'和您的对象的id来创建其全局唯一ID。

如果你的对象没有一个名为'id'的字段,那么它就不会附加它,你的所有globalIdField都只是你传入的字符串和':'。所以它们不会是独一无二的,它们都是一样的。

您可以传递给globalIdField的第二个参数,它是一个获取对象并返回要使用的globalIdField的id的函数。所以假设你的对象的id字段实际上被称为'_id'(感谢Mongo!)。您可以这样调用globalIdField:

id: globalIdField('Image', image => image._id)

你去吧。继电器的唯一ID。

以下是graphql-relay-js中相关源代码的链接:https://github.com/graphql/graphql-relay-js/blob/master/src/node/node.js#L110

答案 1 :(得分:0)

将以下代码粘贴到浏览器控制台

atob('SW1hZ2U6')

你会发现id的值是“Image:”。

表示(new MyImages()).getAll()提取的记录的所有id属性 是空的。

返回union id,或者我建议您将图像定义为GraphQLList

var ImageListType = new GraphQL.GraphQLObjectType({
  name: 'ImageList',
  description: 'A list of images',
  fields: () => ({
    id: Relay.globalIdField('ImageList'),
    images: {
      type: new GraphQLList(ImageType),
      description: 'A collection of images',
      args: Relay.connectionArgs,
      resolve: (_, args) => Relay.connectionFromPromisedArray(
        (new MyImages()).getAll(),
        args
      ),
    },
  }),
  interfaces: [nodeDefinition.nodeInterface],
});