AppSync использует MQTT поверх WebSockets для своей подписки, а Apollo использует WebSockets. При использовании apollo с AppSync у меня не работает ни компонент Subscription
, ни subscribeForMore
в компоненте Query
.
Одна из функций AppSync, которая вызвала много шума, - это упор на данные в реальном времени. Под капотом функция AppSync в реальном времени поддерживается подписками GraphQL. Хотя Apollo основывает свои подписки на WebSockets через subscriptions-transport-ws, подписки в GraphQL на самом деле достаточно гибкие, чтобы вы могли основывать их на другой технологии обмена сообщениями. Вместо WebSockets подписки AppSync используют MQTT в качестве транспортного уровня.
Есть ли способ использовать AppSync при использовании Apollo?
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>
Просто чтобы добавить примечание об аутентификации, поскольку мне потребовалось время, чтобы решить это:
Если для параметра 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()
}
Новые вопросы
websocket
WebSocket - это API, построенный поверх сокетов TCP и протокола для двунаправленной полнодуплексной связи между клиентом и сервером без использования HTTP.