3

我是 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)"
    }
  ]
}

我不明白那个错误请帮助我。谢谢!提前

4

5 回答 5

6

这可能听起来很傻,但开发人员仍然会犯这种错误,我也是。在订阅中,客户端只能检索突变查询中输出的那些字段。例如,如果您的变异查询如下所示:

mutation newMessage { addMessage(input:{ field_1: "", field_2: "", field_n: "", }){ field_1, field_2 } }

在上述突变中,因为我们只输出 field_1 和 field_2。客户端可以检索这些字段的唯一子集。

因此,如果在模式中,对于订阅,如果您已将 field_3 定义为必需(!),并且由于您没有在上述突变中输出 field_3,这将引发错误,即不能为不可为 null 的类型返回 null:field_3。

于 2020-05-08T10:46:52.407 回答
2

看起来路径 [getMessages, sendBy] 正在解析为一个null值,而您的架构定义 ( sendBy: Person!) 表示sendBy字段无法解析为 null。请检查解析器是否附加到sendBytype中的字段Messages

如果附加了解析器,请为此 API 启用 CloudWatch 日志(这可以在控制台的设置页面上完成,选择全部选项)。您应该能够检查路径 [getMessages, 0, sendBy] 的已解析请求/响应映射是什么。

于 2018-05-30T04:52:47.207 回答
0

我有一个类似的问题。

发生在我身上的是更新解析器的问题。我正在更新一个用作 GSI(全球二级索引)的字段。但我没有更新 GSI,所以当 GSI 查询时索引存在,但该属性的键已更改。

如果您使用的是 Dynamo DB,则可以从那里开始调试。您可以检查该项目,看看您是否对主键或索引有任何引用。

于 2019-11-30T20:27:50.060 回答
0

我有一个类似的问题。

对我来说,问题在于模式的返回类型。当我在 dynamodb 表上使用 PK 进行查询时,它返回了您可以说的项目或数据列表。但在我的架构中,我有一个架构定义为单一结构格式。

当我将模式中的返回类型设置为项目列表时,错误已解决。

喜欢

type mySchema { 
[ID]
}

而不是类型 mySchema

{ 
id : ID!
name : String!
details : String!
}

引发此错误的原因有多种。所以你的原因可能是别的,但我仍然只是发布了其中一个场景。

于 2021-06-03T07:52:57.590 回答
0

我在使用 CloudFormation 进行设置时遇到了类似的问题。在我的特殊情况下,我没有为全局二级索引正确配置投影。由于属性未投影到索引中,因此我在响应中得到了一个 ID,但所有其他值都为 null。将 ProjectionType 更新为“ALL”解决了我的问题。并不是说这是“正确”的设置,但对于我的特定实现来说,这是需要的。

可以在此处找到有关 CloudFormation 的全球二级索引投影的更多信息:https ://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-projectionobject.html

从源表复制(投影)到索引中的属性。这些属性是对主键属性和索引键属性的补充,它们是自动投影的。

于 2018-07-17T04:40:01.683 回答