AWS数据存储第一次打开应用程序时不查询



我使用来自Aws-amplify的Datastore。我有一个问题。问题只发生在应用程序第一次打开(当我擦除设备数据/重新安装)。只有当我再次重新加载应用程序时,才会加载数据。例如,App.js中的代码console.log(user)说它是未定义的。当我重新加载时,一切正常(问题是只有当我重新安装应用程序/擦除设备数据)

这是来自App.js的代码示例,console.log(user)显示我未定义。当我重新加载应用程序时,一切正常。其他查询也不工作,如帖子等。我总是需要重新加载app,然后它就能工作了

const App = () => {
useEffect(() => {
const saveUsertoDB = async () => {
//get user from cognito
const userInfo = await Auth.currentAuthenticatedUser();
if (!userInfo) {
return;
}
console.log(userInfo);
const userId = userInfo.attributes.sub;
console.log(userId);
//check if user exist in DB
const user = (await DataStore.query(User)).find(
user => user.sub === userId,
);
console.log(user);
//if not save user to db
if (!user) {
await DataStore.save(
new User({
sub: userId,
name: userInfo.attributes.email,
}),
);
} else {
console.warn('User already exist in DB');
}
};
saveUsertoDB();
}, []);

问题和解决方案是什么?

数据存储查询始终针对本地存储运行。您提到问题发生在您清空本地商店之后。当应用程序启动时没有本地数据,它不会开始同步,直到你执行第一个查询,这可能还没有找到任何东西。

要解决您的问题,请尝试在应用程序启动开始时使用DataStore.start,然后在继续应用程序之前监视Amplify hub的Datastore ready事件。这将确保在执行查询之前所有数据在本地同步。

事件详情见文档

一种选择是等待来自Hub的ready事件:

// Create listener
const listener = Hub.listen("datastore", async hubData => {
const  { event, data } = hubData.payload;
if (event === "ready") {
// do something here once the data is synced from the cloud
}
})
// Remove listener
listener();

另一个方便的选择是使用相对较新的observeQuery()方法,它为调用query()observe()提供了一些很好的语法糖:

const subscription = DataStore.observeQuery(
Post,
p => p.title("beginsWith", "post").rating("gt", 10),
{
sort: s => s.rating(SortDirection.ASCENDING)
}
).subscribe(snapshot => {
const { items, isSynced } = snapshot;
console.log(`[Snapshot] item count: ${items.length}, isSynced: ${isSynced}`);
});

除了这两个主要选项,您可能希望手动query(),然后observe()更新您的选择标准。

相关内容

  • 没有找到相关文章

最新更新