【发布时间】: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
如果我遗漏了任何重要信息,请告诉我。提前感谢您的帮助。
【问题讨论】: