Search code examples
react-nativeasync-awaitapolloapollo-clientasyncstorage

React Native AsyncStorage.getItem is not working. ({"_40": 0, "_55": null, "_65": 0, "_72": null})


Good day! I have this function of AsyncStorage that gets an item of a token. I used with ApolloClient to process the token but when I test it first, it seems to have an error with what will I get by AsyncStorage function.

export function jwtLogin(data) {
  return async dispatch => {
    const userData = {
      email: data.email,
      password: data.password,
    };
    console.log(userData);
    const client = new ApolloClient({
      link: new HttpLink({
        uri: API_URL,
      }),
      cache: new InMemoryCache(),
    });
    client
      .mutate({
        mutation: loginUser,
        variables: {
          email: userData.email,
          password: userData.password,
        },
      })
      .then(resp => {
        console.log(resp.data.tokenCreate);
        console.log('Token', resp.data.tokenCreate.token);
        if (resp.data.tokenCreate.token !== null) {
          saveJWTTokenData(resp.data.tokenCreate.token); //from AsyncStorage save function

          async function main() { //function of AsyncStorage
            await AsyncStorage.getItem('jwt_token').then(item => {
              return item;
            });
          }
          console.log(main()); // returns error
          Actions.push('main_loading');
        } else {
          const errors = resp.data.tokenCreate.errors;
          {
            errors.map(err => {
              Alert.alert('Error.', err.message);
            });
          }
        }
      })
      .catch(err => {
        Alert.alert('Error.', err.message);
      });
  };
}

For the save storage function:

export const saveJWTTokenData = async jwt_token => AsyncStorage.setItem('jwt_token', jwt_token);

My Error Log Picture


Solution

  • I think your Promise is not handled correctly..

    Try to add a catch after your then call like this:

    .catch(err => console.log(err))
    

    Or try to use your function like this maybe:

          await getData("jwt_token")
        .then(data => data)
        .then(value => this.setState({ token: value })) // here it is setState but I guess you can also return
        .catch(err => console.log("AsyncStorageErr: " + err));