Javascript RESTAPI之上的GraphQL

Javascript RESTAPI之上的GraphQL,javascript,json,rest,graphql,Javascript,Json,Rest,Graphql,早上好,伙计们,我目前正致力于在RESTAPI之上编写GraphQL。假设JSON响应是一个包含id、名称、电子邮件和地址等元素的对象“用户”,地址是一个由street、suite、city和zipcode组成的对象。如何在架构中声明此“地址”字段的类型,该字段包含多个元素。我已经看过文档,无法理解适合我的场景的正确类型 与架构相关的代码片段如下所示: export default new GraphQLObjectType({ name: 'User', description

早上好,伙计们,我目前正致力于在RESTAPI之上编写GraphQL。假设JSON响应是一个包含id、名称、电子邮件和地址等元素的对象“用户”,地址是一个由street、suite、city和zipcode组成的对象。如何在架构中声明此“地址”字段的类型,该字段包含多个元素。我已经看过文档,无法理解适合我的场景的正确类型

与架构相关的代码片段如下所示:

export default new GraphQLObjectType({
    name: 'User',
    description: 'User(s) object in JSONPlaceholder Fake API',
    fields: () => ({
        id: {
            type: GraphQLID
        },
        name: {
            type: GraphQLString
        },
        username: {
            type: GraphQLString
        },
        email: {
            type: GraphQLString
        },
        address: {
            type: (?)
        }
    })
})
下面是我针对的JSON API

{
  "id": 1,
  "name": "Leanne Graham",
  "username": "Bret",
  "email": "Sincere@april.biz",
  "address": {
    "street": "Kulas Light",
    "suite": "Apt. 556",
    "city": "Gwenborough",
    "zipcode": "92998-3874",
    "geo": {
      "lat": "-37.3159",
      "lng": "81.1496"
    }
  },
  "phone": "1-770-736-8031 x56442",
  "website": "hildegard.org",
  "company": {
    "name": "Romaguera-Crona",
    "catchPhrase": "Multi-layered client-server neural-net",
    "bs": "harness real-time e-markets"
  }
}
我考虑创建单独的对象,并创建解析器来只获取特定的“地址”对象,但这意味着我要查询两次。我想可能有一些解决办法来避免这种情况


提前谢谢

如您所述,您应该创建一个新的GraphQLObjectType来表示address对象及其字段,然后将其设置为address类型。在这种情况下,由于字段名与JSON有效负载匹配,因此不需要自定义解析器

如果您认为可能会重复调用RESTAPI,您可能会发现facebook上的库很有用。您可以使用它来确保对RESTAPI的给定请求在每个请求中只发出一次。它还可以帮助解决其他问题,如批处理

你的代码看起来像这样-

const AddressType = new GraphQLObjectType({
    name: 'AddressType',
    description: 'Address',
    fields: () => ({
        // then add all the fields on address  
    })
})

export default new GraphQLObjectType({
    name: 'User',
    description: 'User(s) object in JSONPlaceholder Fake API',
    fields: () => ({
        id: {
            type: GraphQLID
        },
        name: {
            type: GraphQLString
        },
        username: {
            type: GraphQLString
        },
        email: {
            type: GraphQLString
        },
        address: {
            type: AddressType
        }
    })
})

谢谢我已经计算出,实际上包含在对象中的对象可以像上面所说的那样声明。奇怪的是,缓存机制可以根据load()方法传递的参数或DataLoader对象内部的HTTP请求检测类似的请求?目前我认为有很多解决方法,比如load()方法中花括号内的pass参数,以及在HTTP请求中解包以进行修改,或者我只调用一个函数,该函数接受返回DL对象的任何参数,该对象只调用load特定(和操纵)参数?你推荐哪种方法?我已经大量使用了加载程序,在我们的团队中,如果我们需要传递多个参数来加载,我们会传递一个对象(大括号中的参数来加载)。如果这样做,则必须提供cacheKeyFn,因为默认情况下它使用标识比较而不是值比较。对于键按相同顺序提供的小对象,可以通过设置
cacheKeyFn:JSON.stringify