Javascript GraphQL无法解析嵌套对象属性
我试图返回一个带有列表中某些嵌套属性对象的graphQL查询。一切似乎都正常,但我得到的是空值 预期数据结构响应(关于结构的更多细节): 查询:Javascript GraphQL无法解析嵌套对象属性,javascript,json,ajax,graphql,Javascript,Json,Ajax,Graphql,我试图返回一个带有列表中某些嵌套属性对象的graphQL查询。一切似乎都正常,但我得到的是空值 预期数据结构响应(关于结构的更多细节): 查询:{subscriptions{subscription{id customer\u id}}} GraphQL查询对象: var Query = new graphQL.GraphQLObjectType({ name: 'Query', description: 'Root of the Schema', fields: {
{subscriptions{subscription{id customer\u id}}}
GraphQL查询对象:
var Query = new graphQL.GraphQLObjectType({
name: 'Query',
description: 'Root of the Schema',
fields: {
subscriptions: {
type: new graphQL.GraphQLList(SubscriptionsList),
args : {
customer_name: { type: graphQL.GraphQLString },
customer_id: { type: graphQL.GraphQLString }
},
resolve : function (source, args) {
return getSubscriptions().then(function (res) {
// Shows that data is returned
console.log('Data: ', res.list);
return res.list;
}).catch(function (err) {
return err;
});
}
}
}
});
它希望返回订阅列表的类型graphqlist
:
var SubscriptionsList = new graphQL.GraphQLObjectType({
name : 'SubscriptionObj',
description : 'stuff',
fields : function () {
return {
subscription : {
type : Subscription,
resolve : function (subscription) {
return subscription;
}
}
}
}
});
哪个应解析嵌套字段属性:
var Subscription = new graphQL.GraphQLObjectType({
name : 'Subscription',
description : 'stuff',
fields : function () {
return {
id: {type: graphQL.GraphQLString},
customer_id: {type: graphQL.GraphQLString}
}
}
});
Console.log(res.list)输出(来自查询):我肯定得到了我期望的数据和结构:
[ { subscription:
{ id: 'cbdemo_lloyd-sub2',
customer_id: 'cbdemo_lloyd',
plan_id: 'cbdemo_nuts',
addons: [Object],
due_invoices_count: 0,
shipping_address: [Object] },
customer: {
...
}
},
{...}
]
图形SQL查询输出:
{
"data": {
"subscriptions": [
{
"subscription": {
"id": null,
"customer_id": null
}
},
{
"subscription": {
"id": null,
"customer_id": null
}
},
EDIT实际上不需要,但下面是返回承诺的
getSubscriptions()
API调用:
function getSubscriptions() {
return new Promise(function (resolve, reject) {
chargebee.subscription.list({
limit : 5,
"plan_id[is_not]" : "basic",
"status[is]" : "active",
"sort_by[asc]" : "created_at"
}).request(function(error,result){
if (error) return reject(error);
return resolve(result);
});
});
}
看来你有点糊涂了, 基本上,当你
new graphQL.GraphQLList(SubscriptionsList),
这已经是一个列表了。
这意味着你真正的意思是
new graphQL.GraphQLList(Subscription),
接下来,您的订阅对象不包含任何解析逻辑,
所以我希望它是这样的:
var Subscription = new graphQL.GraphQLObjectType({
name : 'Subscription',
description : 'stuff',
fields : function () {
return {
id: {
type: graphQL.GraphQLString,
resolve: function(subscription) {
return subscription.subscription.id;
}
},
customer_id: {
type: graphQL.GraphQLString,
resolve: function(subscription) {
return subscription.subscription.customer_id;
}
},
}
}
});
基本上,GraphQL将使用Subscription对象解析所提供列表中的每个javascript对象。
每个解析器都将获取javascript对象作为第一个值,
然后从中返回基本值。我认为订阅列表中的解析器必须返回
subscription.subscription
。我会考虑更改订阅列表的名称,因为它非常混乱。
在我看来,您应该拥有一个GraphQList(订阅)并删除额外级别的嵌套。或者将包含订阅和客户的东西称为其他东西。根据您的帖子,
res.list
显示以下内容:
// listing #1
[
{
subscription: {
id: 'cbdemo_lloyd-sub2',
customer_id: 'cbdemo_lloyd',
plan_id: 'cbdemo_nuts',
addons: [Object],
due_invoices_count: 0,
shipping_address: [Object] },
customer: {
...
}
},
{...}
]
现在,上述结果对应于查询中的订阅
字段,该字段是订阅列表
的列表。因此,SubscriptionsList
的值将是上述清单#1中的项目:
在SubscriptionsList
类型中,您有一个字段subscription
。它的resolve函数返回它得到的任何结果。因此,字段subscription
与清单2相同
在解析subscription
字段(键入subscription
)时,它在清单2中所示的对象中查找id
和customer\u id
属性。但该对象只有subscription
属性。因此,id
和customer\u id
字段接收null
值
因此,问题在于subscription
字段的resolve函数中。它的输入是清单#2中的对象,输出应该是下面清单#3中的对象:
要获取清单3中的对象,请更改SubscriptionsList
类型:
subscription : {
type : Subscription,
resolve : function (item) { // item is listing #2
return item.subscription; // item.subscription is listing #3
}
}
另一方面,GraphQL对象类型SubscriptionsList
在这里实际上是不必要的,这使得整个事情变得复杂。没有它,整个设计将变得简单得多。小提示,如果您将console.log添加到Subscription的解析器下,您应该能够看到列表中的每个obejct,以确保您的方向正确。为什么我需要解析id
和客户id
?我的getSubscriptions()
方法返回响应时不是已经在解析了吗?为什么GraphQL需要解析这些字段?GraphQL不知道如何处理对象。只有您为其定义的类型。基本上,您是在声明一个新类型订阅
,然后描述如何解析每个字段。这实际上是GraphQL的强大功能之一,因为1个对象不必与数据库层对象相同。可以找到更多信息
// listing #2
{
subscription: {
id: 'cbdemo_lloyd-sub2',
customer_id: 'cbdemo_lloyd',
plan_id: 'cbdemo_nuts',
addons: [Object],
due_invoices_count: 0,
shipping_address: [Object] },
customer: {
...
}
}
}
// listing #3
{
id: 'cbdemo_lloyd-sub2',
customer_id: 'cbdemo_lloyd',
plan_id: 'cbdemo_nuts',
addons: [Object],
due_invoices_count: 0,
shipping_address: [Object] },
customer: {
...
}
}
subscription : {
type : Subscription,
resolve : function (item) { // item is listing #2
return item.subscription; // item.subscription is listing #3
}
}