GraphQL - 从嵌套的JSON对象中获取所有字段

时间:2016-05-05 20:18:20

标签: graphql

我按照Zero to GraphQL in 30 minutes中的描述将GraphQL包装器放在现有的REST API上。我有一个产品的API端点,其中一个属性指向嵌套对象:

// API Response
{
  entity_id: 1,
  nested_object: {
    key1: val1,
    key2: val2,
    ...
  }
}

是否可以定义模式,以便我可以在不显式定义嵌​​套对象及其所有属性的情况下获取整个嵌套对象?我希望我的查询只指定我想要嵌套对象,而不需要从嵌套对象中指定我想要的所有属性:

// What I want
{
  product(id: "1") {
    entityId
    nestedObject
  }
}

// What I don't want
{
  product(id: "1") {
    entityId
    nestedObject {
      key1
      key2
      ...
    }
  }
}

我可以使用第二个版本,但它需要大量额外代码,包括创建NestedObjectType并指定所有嵌套属性。我还想出了如何自动获取所有键的列表,如下所示:

const ProductType = new GraphQLObjectType({
  ...

  fields: () => ({
    nestedObject: {
      type: new GraphQLList(GraphQLString),
      resolve: product => Object.keys(product.nested_object)
    }
  })
})

但我还没有找到一种自动返回整个物体的方法。

2 个答案:

答案 0 :(得分:5)

  

我可以做第二个版本,但它需要很多额外的代码,包括创建NestedObjectType和指定所有嵌套属性。

做吧!这将会非常棒。这是将GraphQL充分发挥其潜力的方法。

除了防止过度获取之外,它还为您提供了许多其他好处,例如类型验证,以及更易读和可维护的代码,因为您的模式可以更全面地描述您的数据。你以后会感谢你自己做额外的工作。

如果由于某种原因你真的不想走这条路并完全理解后果,你可以使用JSON.stringify将嵌套对象编码为字符串。

但就像我说的那样,我建议你不要这样做!

答案 1 :(得分:0)

您可以尝试使用标量JSON类型。您可以找到更多here (based on apollographql)

  • KeyError at /accounts/register 'userName' 添加到架构定义中;
  • scalar JSON添加到解析功能;
  • 在shema中使用JSON类型:
{JSON: GraphQLJSON}
  • 查询示例:

    scalar JSON
    type Query {
        getObject: JSON
    }

  • 结果:

    query {
      getObject
    }

基本代码:


    {
      "data": {
        "getObject": {
          "key1": "value1",
          "key2": "value2",
          "key3": "value3"
        }
      }
    }