【问题标题】:How to return complex object as scalar type in GraphQL?如何在 GraphQL 中将复杂对象作为标量类型返回?
【发布时间】:2021-06-22 12:57:39
【问题描述】:

假设我们有一个 GraphQL API,它可以返回一个具有 IdName 属性的对象 Entity,我请求了 Name强>仅:

query {
    entities {
        name
    }
}

然后它返回

{
    "data": {
        "entities": [
        {
            "name": "Name1"
        },
        {
            "name": "Name2"
        }
        ]
    }
}

但是,如果我只想将实体名称作为标量类型呢?换句话说,我想要这样的东西:

{
    "data": {
        "entities": [
            "Name1",
            "Name2"
        ]
    }
}

是否可以在不更改 GraphQL API 端的情况下获得这样的结果? Aliases, Fragments 等。GraphQL 有很多内置的查询能力,但是没有一个已知的我可以将复杂的对象返回为标量类型。

【问题讨论】:

  • 共享实体的类型定义架构?
  • entities(): [Entity] 实体: id: int!名称:字符串
  • 您可以使用值 Name1、Name2.. 创建枚举类型,但您需要更改服务器端以让 graphql 知道如何处理枚举
  • 谢谢,但我有几个客户有不同的需求,试图找到不改变的方式,GraphQL 是灵活的,但不是在所有情况下:-(

标签: graphql


【解决方案1】:

如果您不想更改 Entities 的类型定义,您所要求的几乎是不可能的。

这个:??

Entity: id: int! name: String
entities(): [Entity]

返回带有键 nameid 的对象数组。

要实现您的要求,您可以将 Entity 更改为只是一个字符串,或者让您的客户在收到该对象时将该对象缩减为仅包含 Entity names 的数组。

他们可以这样做:

const data = {
  entities: [
    {
      name: 'Name1',
    },
    {
      name: 'Name2',
    },
  ],
};

const entityNames = data.entities.reduce(
  (acc, curr) => [...acc, curr.name],
  []
);

console.log(entityNames);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2019-12-15
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多