【问题标题】:AWS Amplify AppSync Subscription: data returning nullAWS Amplify AppSync 订阅:数据返回 null
【发布时间】:2020-12-28 06:45:16
【问题描述】:

我正在开发我的 Amplify 应用程序,并且我的订阅工作正常:

graphql:

type Item @model(subscriptions: null)
    @auth(rules: [
        {allow: owner},
        {allow: groups, groups: ["Admin"], operations: [create, update, read, delete] }
  ]) {
  id: ID!
  name: String
  files: String
}


type Subscription {
    itemUpdated(id: ID): Item @aws_subscribe(mutations: ["updateItem"])
}

js:

const handleSubscription = (data) => {
  if (data.value.data.itemUpdated) {
    setItemObj(data.value.data.itemUpdated);
  }
};
useEffect(() => {
  const subscription = API.graphql(
      graphqlOperation(subscriptions.itemUpdated, {
        id,
      }),
    ).subscribe({
      next: handleSubscription,
    });
    return () => subscription.unsubscribe();
  }, []);

在 handleSubscription 方法中,当应用对 Item 进行突变调用时,返回数据 (data.value.data.itemUpdated) 将具有正确的数据。

现在,由于我显然不清楚的原因,当发生突变时,我仍然可以看到订阅事件触发,但返回数据 (data.value.data.itemUpdated) 始终为空。

我已尝试按照This Question 的建议从 graphql 模式的 auth 字段中删除 {allow: owner} 规则 - 这不起作用(此外:我仍然很好奇为什么这首先会起作用,但我确实做到了没有足够的代表发表评论)。

在写这篇文章时,我的想法是我将尝试在没有 {allow: owner} 规则的情况下创建一个新项目并重试,如果可行,我会报告回来,但我的问题将转向询问为什么然后询问我怎样才能确保物品对所有者仍然是私有的?最后,我几乎可以肯定,{allow: owner} 规则也在其中起作用,但我可能弄错了。

我也试过了:

  • 通过更新不同的项目字段进行测试

  • 让放大 cli 重建我的 graphql js 文件

  • 更改代码,即

    • 删除了return () => subscription.unsubscribe();
    • 使输入更具体API.graphql(graphqlOperation(subscriptions.itemUpdated, {input: { id: id },})(我确信这无关紧要,但我想尝试一下。)

我只是不确定这里发生了什么。这一切看起来都很简单,而且一定是我错过了一些愚蠢的东西......我知道我最终会弄明白的,但我想在这里点击任何人以防万一。

版本:

  • "aws-amplify": "^3.0.24"
  • "@aws-amplify/ui-react": "^0.2.15"
  • "react": "^16.13.1"
  • amplify-cli: 4.29.0

如果我遗漏了任何重要信息,请告诉我。提前感谢您的帮助。

【问题讨论】:

    标签: aws-amplify aws-appsync


    【解决方案1】:

    好吧..就像我想的那样愚蠢。浪费任何人的时间是我的错!

    API.graphql(
          graphqlOperation(subscriptions.itemUpdated, {
             id: Id,
          }),
        ).subscribe({
          next: handleSubscription,
        });
    

    它是id: Id, 参数。我之前将Id var 命名为id,并且js 允许将{name: name} 短于{ name } - 我必须更改id var 并直接转到{input: { id: Id },},这是订阅的错误语法。

    真正的愚蠢举动,我感到很尴尬。即使在测试期间,也可以很好地吸取错误命名的教训。

    【讨论】:

    • 我希望我的也这么简单。我只是试图调整身份验证,以便我的 lambda 可以访问 GraphQL,现在 Angular 正在返回空值。我没有接触架构..这感觉就像在一个大型项目中相互保证的破坏。
    • @Mark 我现在遇到了同样的问题。我想要另一个 lambda 来利用我的 gql 端点,但它似乎不起作用。
    • @RoboKozo 如果我没记错的话,当我尝试添加新的身份验证时,它会更改顺序并从认知默认值变为新的。我必须找到在某些放大配置中设置的位置才能撤消订单。等我回到电脑上看看能不能找到文件。
    • @Mark 在我的情况下,这与我的突变只请求我的突变所需字段的一个子集有关。因此,如果您的突变返回{ x, y, z },但您的订阅请求{ x, y, foo },您将获得nullfoo
    • @RoboKozo,是的,我也遇到了这个问题,因为我有一个 Lambda 对上传的文件执行命令,并且需要将所有字段添加到查询中,以便在我的 Angular 前端正确获取 websocket 更新。绝对是受害者。
    猜你喜欢
    • 2020-03-05
    • 2018-09-30
    • 2021-03-11
    • 2020-01-03
    • 2019-04-14
    • 2019-03-07
    • 2019-06-15
    • 2019-01-01
    • 2019-03-05
    相关资源
    最近更新 更多