【问题标题】:How do I add a Scalar JSON type in graphQL yoga server?如何在 graphQL 瑜伽服务器中添加标量 JSON 类型?
【发布时间】:2019-06-13 08:55:22
【问题描述】:

我有一个 rest API,它返回一个对象,其中包含一个 id 列表,每个对象都有计数。

{
    "orders": {
      "PMY5XbR7FZo5qEkEb": 0
    }
}

我不知道orders对象的key是什么,也不知道会有多少key。

This question's response 建议使用 JSON 类型,虽然有风险但可行。

问题在于这不适用于 graphQL 瑜伽服务器:

type Task {
  orders:  JSON
}

如何在瑜伽服务器中引用 JSON 类型?

【问题讨论】:

  • 除了该问题的答案之外,我不推荐这种方法,但您需要声明 scalar JSON 才能使其工作。更好的方法是将该对象映射到type Order { id: ID!, count: Int! }
  • 你能解释一下“你需要声明标量 JSON”是什么意思吗,对不起,我不明白这是什么意思。
  • 将词 scalar JSON 放在您的 GraphQL 架构的顶层某处。你需要 explicitly declare scalar types 虽然 GraphQL 本身并没有赋予它们任何特殊含义。
  • 成功了。惊人的。非常感谢您。如果您将该回复重新发布为答案,我可以将其标记为已回答。我知道考虑到它的简单程度,它可能看起来微不足道,但这对我来说是一个巨大的帮助,而且很可能会帮助其他想要返回一个对象的人。返回一个动态对象似乎是一件很常见的事情,很惊讶没有更好的解决方案。

标签: server graphql graphql-js


【解决方案1】:

您需要先explicitly declare scalar types 才能使用它们。要使此架构起作用,您需要添加一个额外的声明:

scalar JSON
type Task {
  orders:  JSON
}

GraphQL 对标量值的内容一无所知,这意味着这会将额外的处理工作推给客户端(以验证和反序列化 JSON),而这并不能真正描述您的对象模型。

您可能会考虑重新安排后端响应以拥有更结构化的对象模型。作为 API 消费者,我会发现它更易于理解和使用

type Order {
  id: ID!
  count: Int!
}
type Task {
  orders: [Order!]!
}

但是你不能直接将后端 REST API 结果传递给这个表单而不重新排列它。

【讨论】:

  • 谢谢。第二个解决方案的唯一问题是我无法控制其余端点。它给了我一个带有动态键且数量不确定的对象。如果我无法更改此响应,我还能应用您的第二个解决方案吗?
  • 从您的问题看来,您的 orders 字段的解析器函数对后端进行了 REST 调用。您提出的解决方案是在返回之前获取该响应并将其序列化为 JSON 字符串;在同一个地方,在 REST 调用返回之后但在您做出 GraphQL 响应之前,您有机会重新排列数据。
  • 我现在明白你的意思了。谢谢大卫。
猜你喜欢
  • 2019-02-08
  • 2020-10-25
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 2018-07-19
  • 2020-04-23
  • 2019-04-17
  • 2016-07-23
相关资源
最近更新 更多