即使属性的值在数据库中(而不是对象)为空,如何检索属性的所有子属性?

时间:2019-06-22 08:04:27

标签: graphql graphql-js

(发布后的解决方案)

考虑一个名为 userFetch 查询,其定义如下:

type User_Details {
  phone_number: String
}

type User {
  name: String
  details: User_Details 
}

使用数据库中的以下数据获取用户时,我没有获得 phone_number 子字段。

// in database
{
  name: "Joe"
}

通过GraphQL我得到以下信息:

// response
{
  name: "Joe",
  details: null
}

当我期望的时候:

// expected response
{
  name: "Joe",
  details: {
    phone_number: null
  }
}

如何使GraphQL保留子字段(即使全为空)?

像上一个示例一样,当缺少整个子对象时,这对于我的前端是个问题。

感谢您的提示和技巧;)


编辑:解决方案

我了解GraphQL是透明的,不会强制使用任何输出格式(只需从获取的数据中选择可用的格式)。 就我而言,我(有时)想强制执行此行为。主要情况是当我在客户端界面中使用响应时,即使尚未在数据库中进行设置,也需要能够使用所有子属性。

之前,您已经知道我已经在graphql周围构建了一个环境,该环境可以使我做很多事情(例如获取类型的默认/空对象)。 尚未开源。

要对所有子属性强制执行响应,无论存储在数据库中的是什么,我创建了一个 GraphQL中间件,它将解析的数据与我的默认值/对象合并 strong>。

这样,这是我的graphql端点上的一个简单附加组件,它根据请求参数允许我强制执行完整响应或简约的通常响应:)

1 个答案:

答案 0 :(得分:1)

GraphQL不能确定字段的值,它只是一个传输层。如果您的对象看起来像这样:

const user = { name: "Joe" };

您的查询如下:

{
  user {
    name
    details
  }
}

GraphQL引擎无法弄清楚用户的实际详细信息,因为这些详细信息为空(或未定义,对此相同)。如果您希望发送非null的user.details,则必须从某个地方获取它们。
具体来说,如果您希望您的回复如下所示:

{
  name: "Joe",
  details: {
    phone_number: null
  }
}

您发送的用户必须如下所示:

const user = {
  name: "Joe",
  details: {
    phone_number: null
  }
}