GraphQL SDL(aws appsync)中的“不能为不可为空的类型返回 null:父“消息”(/getMessages/sendBy)中的“人”
Posted
技术标签:
【中文标题】GraphQL SDL(aws appsync)中的“不能为不可为空的类型返回 null:父“消息”(/getMessages/sendBy)中的“人”【英文标题】:"Cannot return null for non-nullable type: 'Person' within parent 'Messages' (/getMessages/sendBy)" in GraphQL SDL( aws appsync) 【发布时间】:2018-11-08 19:39:57 【问题描述】:我是 graphql 的新手。我正在使用 aws appsync 实现一个 react-native 应用程序。以下是我在架构中编写的代码
type Messages
id: ID!
createdAt: String!
updateAt: String!
text: String!
sendBy: Person!
@relation(name: "UserMessages")
type Person
id: ID!
createdAt: String!
updateAt: String!
name: String!
messages: [Messages!]!
@relation(name: "UserMessages")
当我尝试查询 sendBy 值时,它给了我一个错误提示
query getMessages
getMessages(id : "a0546b5d-1faf-444c-b243-fab5e1f47d2d")
id
text
sendBy
name
"data":
"getMessages": null
,
"errors": [
"path": [
"getMessages",
"sendBy"
],
"locations": null,
"message": "Cannot return null for non-nullable type: 'Person' within parent 'Messages' (/getMessages/sendBy)"
]
我不明白那个错误请帮助我。谢谢!提前
【问题讨论】:
【参考方案1】:这听起来可能很傻,但开发人员还是会犯这种错误,我也是。在订阅中,客户端只能检索突变查询中输出的那些字段。例如,如果您的变异查询如下所示:
mutation newMessage
addMessage(input:
field_1: "",
field_2: "",
field_n: "",
)
field_1,
field_2
在上述突变中,因为我们只输出 field_1 和 field_2。客户端可以检索这些字段的唯一子集。
因此,如果在模式中,对于订阅,如果您已将 field_3 定义为必需(!),并且由于您没有在上述突变中输出 field_3,这将引发错误,即不能为非可空类型返回 null: field_3。
【讨论】:
【参考方案2】:看起来路径 [getMessages, sendBy] 正在解析为 null
值,而您的架构定义 (sendBy: Person!
) 显示 sendBy
字段无法解析为 null。请检查解析器是否附加到sendBy
类型Messages
中的字段。
如果附加了解析器,请为此 API 启用 CloudWatch 日志(这可以在控制台的设置页面上完成,选择全部选项)。您应该能够检查路径 [getMessages, 0, sendBy] 的已解析请求/响应映射是什么。
【讨论】:
嘿嘿感谢您的时间,我已经尝试过了,但仍然遇到相同的错误,并且可能更具体地说明如何检查 已解决的请求/响应映射是针对路径 [getMessages, 0,发送者]。 嘿 Bharath,您能否启用具有ALL
设置的 CloudWatch 日志并在此处发布内容(如果它没有任何敏感数据)?我可以帮你提供这些信息。谢谢。
感谢 shankar,但我们是否有其他解决方案来解决此问题。我认为我们必须在将 sendBy 附加到映射模板中的类型消息后编写一些代码。我不确定我的信息.你能帮帮我吗
我没有太多信息可以帮助您解决这个问题。从 CloudWatch 日志中获取信息会很有帮助,因此它会告诉我们出了什么问题。您的请求/响应映射模板是什么样的?从路径 ["getMessages", "sendBy"] 返回什么数据?附加到sendBy
的解析器的数据源是什么?关于如何配置解析器,请参考以下文档:docs.aws.amazon.com/appsync/latest/devguide/…【参考方案3】:
我在使用 CloudFormation 进行设置时遇到了类似的问题。在我的特殊情况下,我没有为全局二级索引正确配置投影。由于属性未投影到索引中,因此我在响应中得到了一个 ID,但所有其他值都为 null。将 ProjectionType 更新为“ALL”解决了我的问题。并不是说这是“正确”的设置,但对于我的特定实现来说,这是需要的。
有关 CloudFormation 的全球二级指数预测的更多信息,请访问:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-projectionobject.html
从源表复制(投影)到索引中的属性。这些属性是对主键属性和索引键属性的补充,是自动投影的。
【讨论】:
【参考方案4】:我也有类似的问题。
发生在我身上的是更新解析器的问题。我正在更新一个用作 GSI(全球二级索引)的字段。但我没有更新 GSI,所以当 GSI 查询时,索引存在,但该属性的键已更改。
如果您使用的是 Dynamo DB,则可以从那里开始调试。您可以检查该项目,看看您是否对主键或索引有任何引用。
【讨论】:
【参考方案5】:我也有类似的问题。
对我来说,问题在于 schema 的返回类型。当我在 dynamodb 表上使用 PK 进行查询时,它返回了您可以说的项目或数据列表。但在我的架构中,我将架构定义为单一结构格式。
当我将模式中的返回类型设置为项目列表时,错误已解决。
喜欢
type mySchema
[ID]
而不是 输入我的架构
id : ID!
name : String!
details : String!
由于多种原因引发此错误。所以你的原因可能是别的,但我仍然只是发布了其中一个场景。
【讨论】:
以上是关于GraphQL SDL(aws appsync)中的“不能为不可为空的类型返回 null:父“消息”(/getMessages/sendBy)中的“人”的主要内容,如果未能解决你的问题,请参考以下文章
AWS AppSync - 从 AppSync 控制台运行时的 GraphQL 查询超时
我们可以在不使用 GraphQL 的情况下在项目中实施 AWS-Appsync 吗?
如何使用 AWS appsync (GraphQL) 禁用自省查询?
在 Ionic AWS Starter 模板中使用 Appsync 中的 Graphql 和 AWS Amplify 未捕获的异常 [Object Object]