如何将Apollo Client与AppSync结合使用?

时间:2018-10-24 03:33:10

标签: websocket mqtt apollo react-apollo aws-appsync

AppSync通过WebSockets使用MQTT进行订阅,而Apollo使用WebSockets。将apollo与AppSync结合使用时,Subscription组件或subscribeForMore组件中的Query都不适合我。

  

AppSync一项功能引起了很大的轰动,它强调   实时数据。引擎盖下,AppSync的实时功能强大   通过GraphQL订阅。虽然Apollo的订阅基于   通过subscriptions-transport-ws进行WebSockets,在GraphQL中进行订阅   实际上足够灵活,可以让您基于其他消息   技术。 AppSync的订阅使用MQTT代替WebSockets作为   传输层。

在仍然使用Apollo的同时还能使用AppSync吗?

2 个答案:

答案 0 :(得分:5)

好的,这对我有用。您需要使用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>

答案 1 :(得分:1)

只需添加关于身份验证的注释,因为我花了一些时间才能解决:

如果authenticationType为“ API_KEY”,则必须传递apiKey,如@ C.Lee的答案所示。

fun getDefaultNextYearDate(): Date {
            val cal = Calendar.getInstance()
            cal.time = Date() //current date
            cal.add(Calendar.YEAR, 1)
            return cal.time
        }

如果authenticationType为“ AMAZON_COGNITO_USER_POOLS”,则需要jwkToken,并且 如果您使用的是Amplify,则可以这样做

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

但是,如果您的authenticationType是“ AWS_IAM”,则需要以下内容:

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