Как использовать Apollo Client с AppSync? - PullRequest
0 голосов
/ 24 октября 2018

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

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

Есть ли способ использовать AppSync, все еще используя Apollo?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

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

Если для параметра authenticationType задано значение "API_KEY", то вы должны передать apiKey, как показано в ответе @ C.Lee.,

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

Если тип аутентификации «AMAZON_COGNITO_USER_POOLS», то вам нужен jwkToken, и если вы используете Amplify, вы можете сделать это как

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

Но если ваш тип аутентификации - «AWS_IAM»"тогда вам нужно следующее:

  auth: {
    type: AUTH_TYPE.AWS_IAM,
    credentials: () => Auth.currentCredentials()
  }
0 голосов
/ 24 октября 2018

Хорошо, вот как это работает для меня.Вам нужно будет использовать 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>
...