[英]GraphQL unable to resolve nested object property
我試圖返回帶有列表中的一些嵌套屬性對象的graphQL查詢。 一切似乎都已簽出,但正在獲取空值。
預期的數據結構響應(有關結構的更多詳細信息,請參見此處 ):
//Return a GraphQLList type of all objects :
[
{
"subscription" : {
},
"customer" : {
},
},
]
查詢: { subscriptions { subscription { id customer_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;
});
}
}
}
});
它期望返回SubscriptionsList
GraphQLList
類型:
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)輸出(來自Query):我肯定得到了我期望的數據和結構:
[ { subscription:
{ id: 'cbdemo_lloyd-sub2',
customer_id: 'cbdemo_lloyd',
plan_id: 'cbdemo_nuts',
addons: [Object],
due_invoices_count: 0,
shipping_address: [Object] },
customer: {
...
}
},
{...}
]
GraphQL查詢輸出:
{
"data": {
"subscriptions": [
{
"subscription": {
"id": null,
"customer_id": null
}
},
{
"subscription": {
"id": null,
"customer_id": null
}
},
編輯並不是必須的,但這是返回一個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對象作為第一個值,並從中返回基本值。
我認為您SubscriptionsList中的解析器必須返回subscription.subscription
。 我會考慮更改subscriptionsList的名稱,因為這很令人困惑。
以我的方式看,您應該只擁有一個GraphQLList(Subscription)並刪除該額外的嵌套層。 要么,要么稱包含訂閱和客戶的事物為其他事物。
根據您的帖子, 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: {
...
}
},
{...}
]
現在,以上結果對應於Query
subscriptions
字段,這是SubscriptionsList
的列表。 因此, SubscriptionsList
值將是上述清單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: {
...
}
}
}
在SubscriptionsList
類型中,您有一個字段subscription
。 它的resolve函數返回所獲得的一切。 因此,字段subscription
與清單2相同。
在解析subscription
字段(類型Subscription
)時,它將在清單2中顯示的對象中查找id
和customer_id
屬性。 但是該對象僅具有subscription
屬性。 因此, id
和customer_id
字段接收null
值。
因此,問題出在subscription
字段的解析功能中。 它的輸入是清單2中的對象,其輸出應該是以下清單3中的對象:
// listing #3
{
id: 'cbdemo_lloyd-sub2',
customer_id: 'cbdemo_lloyd',
plan_id: 'cbdemo_nuts',
addons: [Object],
due_invoices_count: 0,
shipping_address: [Object] },
customer: {
...
}
}
要獲得清單3中的對象,請更改您的SubscriptionsList
類型:
subscription : {
type : Subscription,
resolve : function (item) { // item is listing #2
return item.subscription; // item.subscription is listing #3
}
}
另外,在這里實際上不需要GraphQL對象類型SubscriptionsList
這使整個事情變得復雜。 沒有它,整個設計將變得更加簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.