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