簡體   English   中英

GraphQL無法解析嵌套對象屬性

[英]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中顯示的對象中查找idcustomer_id屬性。 但是該對象僅具有subscription屬性。 因此, idcustomer_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM