(发布后的解决方案)
考虑一个名为 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端点上的一个简单附加组件,它根据请求参数允许我强制执行完整响应或简约的通常响应:)
答案 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
}
}