Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript GraphQL无法解析嵌套对象属性_Javascript_Json_Ajax_Graphql - Fatal编程技术网

Javascript 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: {

我试图返回一个带有列表中某些嵌套属性对象的graphQL查询。一切似乎都正常,但我得到的是空值

预期数据结构响应(关于结构的更多细节):

查询:
{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
    }
}