AppSync通过WebSockets使用MQTT进行订阅,而Apollo使用WebSockets。将apollo与AppSync结合使用时,Subscription
组件或subscribeForMore
组件中的Query
都不适合我。
AppSync一项功能引起了很大的轰动,它强调 实时数据。引擎盖下,AppSync的实时功能强大 通过GraphQL订阅。虽然Apollo的订阅基于 通过subscriptions-transport-ws进行WebSockets,在GraphQL中进行订阅 实际上足够灵活,可以让您基于其他消息 技术。 AppSync的订阅使用MQTT代替WebSockets作为 传输层。
在仍然使用Apollo的同时还能使用AppSync吗?
答案 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();
}
}