簡體   English   中英

AWS 放大數據存儲不會與服務器同步

[英]AWS amplify datastore wont synchronise with server

所以我試圖讓 AWS Amplify 的數據存儲庫與我正在構建的 reactJS Web 應用程序一起工作。 我手動使用 graphql 突變將數據發送到 api 和從 api 發送數據,然后我嘗試按照本教程設置 DataStore。 帶有索引數據庫的客戶端一切正常,但我無法讓數據與 api 同步。 我在控制台中收到以下錯誤:

 DataStore - Data won't be synchronized. No GraphQL endpoint configured. Did you forget `Amplify.configure(awsconfig)`?

我仔細檢查了一遍,我肯定將我的 AWS 導出包括在內:

import Amplify from "@aws-amplify/core";
import awsExports from "./aws-exports";

Amplify.configure(awsExports);

生成的./aws-exports.js的內容如下:

/* eslint-disable */
// WARNING: DO NOT EDIT. This file is automatically generated by AWS Amplify. It will be overwritten.

const awsmobile = {
    "aws_project_region": "us-east-2",
    "aws_appsync_graphqlEndpoint": "https://xxxxxxxxxxxxxx.appsync-api.us-east-2.amazonaws.com/graphql",
    "aws_appsync_region": "us-east-2",
    "aws_appsync_authenticationType": "API_KEY",
    "aws_appsync_apiKey": "xxxxxxxxxxxxxx",
    "aws_cognito_identity_pool_id": "us-east-2:xxxxxxxxxxxxx",
    "aws_cognito_region": "us-east-2",
    "aws_user_pools_id": "us-east-2_xxxxxxxxx",
    "aws_user_pools_web_client_id": "xxxxxxxxxxxxxxxxxx",
    "oauth": {}
};


export default awsmobile;

我已經仔細檢查了aws_appsync_graphqlEndpointaws_appsync_apiKey的憑據,它們與 cli 中amplify status返回的值相匹配。 我還運行了amplify push ,並且我的 Api 的狀態為No Change 在設置 api 時,我確保也啟用了沖突解決,如教程中所述。

有趣的是,我在設置放大時也嘗試了以下方法:

import Amplify from "@aws-amplify/core";
import {DataStore} from "@aws-amplify/datastore";
import awsExports from "./aws-exports";

Amplify.configure(awsExports);
DataStore.configure(awsExports);

這解決了DataStore - Data won't be synchronised錯誤,但我得到了以下錯誤,並且數據仍然沒有被發送到 api。

DataStore - subscriptionError Subscribe only available for AWS AppSync endpoint
DataStore - Sync error Subscribe only available for AWS AppSync endpoint

這是否意味着我的 API 配置不正確? 我將如何解決它?

在 Angular 項目中,我一直在擺弄 DataStore 同步。 這是我認為我從其他人發布的觀察或答案中學到的東西

  1. 無法使用 API 密鑰身份驗證,這不起作用。 我使用Cognito用戶池並且有效
  2. 必須啟用Optimistic Concurrency作為沖突解決策略,但我認為即使使用默認的Auto Merge也可以使用,不確定第一次需要的確切時間
  3. 所有類型都需要一個自動生成的“ID!”類型的 id。 否則,當設置偵聽器時會出現錯誤,並且即使對於具有它的類型,同步也不起作用。
  4. 確保重新生成並推送代碼,並且每次架構更改后 DataStore 保持啟用狀態(有時該設置可能會重置)

對於故障排除,啟用跟蹤 ( Amplify.Logger.LOG_LEVEL = 'DEBUG' ) 並在瀏覽器的控制台中過濾包含“err”的消息。 如果存在任何此類消息,則整個同步將不起作用。 這就是您如何判斷您是否有上述問題之一。

另一個技巧是刪除 Chrome Dev Tools 的 Application/Storage 中的本地amplify-datastore IndexDB 如果同步有效,下次您重新加載應用程序時,它將從雲中的 DynamoDB 表數據中重新填充。

這一定是個問題,最近更新了。 大約一周前,我在一個 expo 應用程序中成功使用了 DataStore (v2.2.8)。 昨天,我開始了一個新的 expo 應用程序項目,但無法找到讓 DataStore 同步運行的方法。 您是否嘗試過舊版本的 @aws-amplify/datastore?

當我從aws-amplify而不是@aws-amplify/datastore導入DataStore時,我遇到了同樣的錯誤。 我花了一段時間才弄明白,但我所要做的就是更改導入語句。

因此,嘗試從以下位置更改您的導入語句:

import { DataStore } from "aws-amplify";

至:

import { DataStore } from "@aws-amplify/datastore";

在 @aws-amplify/datastore 版本 2.9.6 到 2.9.9 之間的某個地方,他們更改了 Amplify 配置。 您現在需要將您的aws-exports放入{config: }但是,我無法讓 2.9.9 加載數據,所以我留在 2.9.8

2.9.8 及之前版本:

import awsConfig from "./aws-exports";
import { Amplify} from "@aws-amplify/core";
Amplify.configure(awsConfig);

2.9.9:

import awsConfig from "./aws-exports";
import { Amplify} from "@aws-amplify/core";
Amplify.configure({ config: { awsConfig } });

除了其他人所說的。 嘗試刪除node modulespackage-lock.json 然后運行npm cache clean --force然后npm i 這對我來說只適用於普通Amplify.configure(config)

在應用程序的根目錄中,執行以下操作:

import { Amplify } from "aws-amplify";
import config from "../src/aws-exports.js";

Amplify.configure({
  ...config,
});

那應該為你解決它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM