AWS Amplify AppSync 订阅:数据返回 null

Posted

技术标签:

【中文标题】AWS Amplify AppSync 订阅:数据返回 null【英文标题】:AWS Amplify AppSync Subscription: data returning 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

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

【问题讨论】:

【参考方案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 更新。绝对是受害者。

以上是关于AWS Amplify AppSync 订阅:数据返回 null的主要内容,如果未能解决你的问题,请参考以下文章

放大未捕获的 AppSync 订阅(承诺中)

aws amplify appsync 中的 Graphql 突变错误

AppSync/Amplify - 如何定义 GraphQL 订阅

如何使用 Amplify 为 GraphQL API (AWS AppSync) 生成类

使用 AWS Amplify/AppSync 的嵌套 GraphQL 突变

AWS- Amplify - Appsync:使用 CLI 从 Android 应用程序更改云资源时,正确的工作流程是啥?