AWS Amplify хранилище данных не синхронизируется с сервером

Итак, я пытаюсь заставить библиотеку хранилища данных AWS Amplify работать с веб-приложением responseJS, которое я создаю. Я отлично отправлял данные в api и обратно, используя мутации graphql вручную, а затем я попытался настроить 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_graphqlEndpoint а также aws_appsync_apiKey и они соответствуют значениям, возвращаемым из 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 error, но вместо этого я получил следующие ошибки, а данные по-прежнему не отправляются в api.

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

Означает ли это, что мой API как-то неправильно настроен? Как мне это исправить?

6 ответов

Я некоторое время возился с синхронизацией хранилища данных в проекте Angular. Вот что, как мне кажется, я узнал из своих наблюдений или ответов, опубликованных другими.

  1. Невозможно использовать аутентификацию ключа API, это не работает. я использую Cognito пул пользователей, и это работает
  2. Пришлось включить Optimistic Concurrency в качестве стратегии разрешения конфликтов, но я думаю, что она работает даже со стандартным Auto Merge, не уверен, когда именно нужно
  3. Всем типам нужен автоматически сгенерированный идентификатор типа «ID!». Без этого вы получите ошибки, когда настроены слушатели, и синхронизация не будет работать даже для типов, у которых она есть.
  4. Убедитесь, что код регенерируется и отправляется, а хранилище данных остается включенным после каждого изменения схемы (иногда этот параметр может сбрасываться)

Для устранения неполадок включите трассировку ( Amplify.Logger.LOG_LEVEL = 'DEBUG') и отфильтруйте в консоли браузера сообщения, содержащие "err". Если такие сообщения существуют, вся синхронизация не работает. Вот как вы можете определить, есть ли у вас одна из перечисленных выше проблем.

Еще одна хитрость - удалить локальный amplify-datastore IndexDBв приложении / хранилище Chrome Dev Tools. Если синхронизация работает, она будет повторно заполнена из данных таблицы DynamoDB в облаке при следующей перезагрузке приложения.

У меня такая же ошибка при импорте DataStore из aws-amplify вместо @aws-amplify/datastore. Мне потребовалось время, чтобы понять это, но все, что мне нужно было сделать, это изменить оператор импорта.

Итак, попробуйте изменить оператор импорта с:

import { DataStore } from "aws-amplify";

кому:

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

Где-то между @aws-ampify / 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 } });

Это должно быть проблема, связанная с недавним обновлением. Около недели назад я успешно использовал DataStore (v2.2.8) в приложении expo. Вчера я начал новый проект приложения expo и не могу придумать способ запустить и запустить DataStore с синхронизацией. Вы пробовали старую версию @aws-ampify/datastore?

В корне вашего приложения сделайте следующее:

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

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

Это должно исправить это для вас.

В дополнение к тому, что сказали другие люди. Попробуйте удалить node modules & package-lock.json. Тогда беги npm cache clean --force а потом npm i. Это сработало для меня с обычным Amplify.configure(config)

Другие вопросы по тегам