AppSync использует MQTT поверх WebSockets для своей подписки, а Apollo использует WebSockets. При использовании apollo с AppSync у меня не работает ни компонент Subscription, ни subscribeForMore в компоненте Query.

Одна из функций AppSync, которая вызвала много шума, - это упор на данные в реальном времени. Под капотом функция AppSync в реальном времени поддерживается подписками GraphQL. Хотя Apollo основывает свои подписки на WebSockets через subscriptions-transport-ws, подписки в GraphQL на самом деле достаточно гибкие, чтобы вы могли основывать их на другой технологии обмена сообщениями. Вместо WebSockets подписки AppSync используют MQTT в качестве транспортного уровня.

Есть ли способ использовать AppSync при использовании Apollo?

6
C.Lee 24 Окт 2018 в 06:33

2 ответа

Лучший ответ

Хорошо, вот как это сработало для меня. Вам потребуется aws-appsync SDK (https: // github .com / awslabs / aws-mobile-appsync-sdk-js), чтобы использовать Apollo с AppSync. Для работы подписки с AppSync не нужно было вносить никаких других изменений.

Настройте ApolloProvider и клиент:

    // App.js
    import React from 'react';
    import { Platform, StatusBar, StyleSheet, View } from 'react-native';
    import { AppLoading, Asset, Font, Icon } from 'expo';
    import AWSAppSyncClient from 'aws-appsync' // <--------- use this instead of Apollo Client
    import {ApolloProvider} from 'react-apollo' 
    import { Rehydrated } from 'aws-appsync-react' // <--------- Rehydrated is required to work with Apollo

    import config from './aws-exports'
    import { SERVER_ENDPOINT, CHAIN_ID } from 'react-native-dotenv'
    import AppNavigator from './navigation/AppNavigator';

    const client = new AWSAppSyncClient({
      url: config.aws_appsync_graphqlEndpoint,
      region: config.aws_appsync_region,
      auth: {
        type: config.aws_appsync_authenticationType,
        apiKey: config.aws_appsync_apiKey,
        // jwtToken: async () => token, // Required when you use Cognito UserPools OR OpenID Connect. token object is obtained previously
      }
    })


    export default class App extends React.Component {
      render() {
        return <ApolloProvider client={client}>
          <Rehydrated>
            <View style={styles.container}>
              <AppNavigator />
            </View>
          </Rehydrated>  
        </ApolloProvider>
    }

Вот как выглядит подписка в компоненте:

    <Subscription subscription={gql(onCreateBlog)}>
      {({data, loading})=>{
        return <Text>New Item: {JSON.stringify(data)}</Text>
      }}
    </Subscription>
11
Arjun 26 Апр 2020 в 19:41

Просто чтобы добавить примечание об аутентификации, поскольку мне потребовалось время, чтобы решить это:

Если для параметра authenticationType указано значение «API_KEY», вам необходимо передать apiKey, как показано в ответе @CLee.

  auth: {
    type: config.aws_appsync_authenticationType,
    apiKey: config.aws_appsync_apiKey,
  }

Если для параметра authenticationType задано значение «AMAZON_COGNITO_USER_POOLS», вам понадобится jwkToken, а если вы используете Amplify, вы можете сделать это как

  auth: {
    type: config.aws_appsync_authenticationType,
    jwtToken: async () => {
      const session = await Auth.currentSession();
      return session.getIdToken().getJwtToken();
    }
  }

Но если ваш authenticationType - "AWS_IAM", вам понадобится следующее:

  auth: {
    type: AUTH_TYPE.AWS_IAM,
    credentials: () => Auth.currentCredentials()
  }
3
DenisH 7 Мар 2019 в 15:10
52960709