Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Proper way to setup AWSAppSyncClient, Apollo & React

I've been having issues getting started with React, Apollo, and AWS-AppSync. I can't resolve this error message:

TypeError: this.currentObservable.query.getCurrentResult is not a function

I'm using the updated packages of @apollo/react-hooks and aws-appsync.

My current setup looks like this.

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';

import config from './aws-exports';
import AWSAppSyncClient from 'aws-appsync';
import { ApolloProvider } from '@apollo/react-hooks';

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
    }
});

ReactDOM.render(
    <ApolloProvider client={client}>
        <React.StrictMode>
            <App />
        </React.StrictMode>
    </ApolloProvider>,
    document.getElementById('root')
);

And I have a function that makes a query that looks like this:

import React from 'react';
import { useQuery } from '@apollo/react-hooks';
import gql from 'graphql-tag';

const Flavors = () => {

    const GET_FLAVORS = gql`
        query listAll {
            items {
                name,
                image
            }
        }
    `;

    const { loading, error, data } = useQuery(GET_FLAVORS);

    if(loading) return <p>loading...</p>
    if(error) return <p>Something went wrong...</p>

    return (
        <div>
        {
            data.listIceCreamTypes.items.map(type => {
                return <div key={type.name}>
                    <img src={type.image} alt={type.name} />
                    <h1>{type.name}</h1>
                </div>
            })
        }
        </div>
    )
}

export default Flavors;

I've gone through various solutions described in https://github.com/apollographql/react-apollo/issues/3148 such as adding:

"resolutions": {
    "apollo-client": "2.6.3"
 }

to package.json. Then re-running npm install and restarting the server.

Nothing seems to solve my issues.

Edit** Here's a repo to reproduce the problem: https://github.com/Rynebenson/IceCreamQL

like image 353
Ryne Avatar asked Mar 22 '20 20:03

Ryne


People also ask

How to connect react to AWS AppSync using Apollo client?

If you are using React with version that support hook, and you don’t have the need for subscription, this option will work very well. Create client.js with following setup. aws-exports is the config download from your AWS AppSync API In your index.js add below code to Apollo client accessible.

How do I set up Apollo API with apolloclient?

Import ApolloClient and instantiate a new client instance. Set your API key with an authorization header. Set your endpoint to uri. Return to index.js and import ApolloProvider and client from the utils directory.

How to make your AWS AppSync client accessible?

Create client.js with following setup. aws-exports is the config download from your AWS AppSync API In your index.js add below code to Apollo client accessible. ApolloProvider will make your AppSync client accessable any child of the entry point component whic is App in this example. item: String!

How do I use Apollo client in react?

We will use Apollo Client since it is familiar to many React developers, but future articles will explore alternative implementations. Import ApolloClient and instantiate a new client instance. Set your API key with an authorization header. Set your endpoint to uri. Return to index.js and import ApolloProvider and client from the utils directory.


1 Answers

I already answered this on other related question here on stackoverflow..

As mentioned in other answer the problem is because aws-appsync is relying in an previous version apollo-client. Using resolutions is not the "cleaner" way to solve this problem as you're fixing a dependency version which is not fully compatible with this library.

I strongly recommend you to create a custom apollo client for AWS AppSync this way:

import { ApolloProvider } from '@apollo/react-hooks';
import { ApolloLink } from 'apollo-link';
import { createAuthLink } from 'aws-appsync-auth-link';
import { createHttpLink } from 'apollo-link-http';
import { AppSyncConfig } from './aws-exports';
import ApolloClient from 'apollo-client';

const url = AppSyncConfig.graphqlEndpoint;
const region = AppSyncConfig.region;
const auth = {
  type: AppSyncConfig.authenticationType,
  apiKey: AppSyncConfig.apiKey
};
const link = ApolloLink.from([
   createAuthLink({ url, region, auth }), 
   createHttpLink({ uri: url })
]);
const client = new ApolloClient({
  link,
  cache: new InMemoryCache()
});

const WithProvider = () => (
  <ApolloProvider client={client}>
    <App />
  </ApolloProvider>
)

export default WithProvider

I also created a more detailed post on medium

like image 141
Guille Acosta Avatar answered Oct 20 '22 21:10

Guille Acosta