как получить возвращаемые значения из обещания, возвращенного из AWS Auth.currentSession()

#javascript #react-native #apollo-client

Вопрос:

Я пытаюсь создать клиент graphql из токенов jwt, которые я могу получить от AWS.

Что мне нужно: объект клиента apollo, определенный в var ListfulClient

 listfulClient ApolloClient {
  "cache": InMemoryCache {
    "addTypename": true,
    "config": Object {
      "addTypename": true,
      "dataIdFromObject": [Function defaultDataIdFromObject],
      "resultCaching": true,
      "typePolicies": Object {},
    },
    "data": Root {
      "canRead": [Function anonymous],
      "data": Object {},
 

что я получаю: обещание

 listfulClient Promise {
  "_U": 0,
  "_V": 0,
  "_W": null,
  "_X": null,
}
 

Похоже, что функция Auth.currentSession() из библиотеки aws amplify возвращает обещание. Тем не менее, я, похоже, не могу проанализировать значение, чтобы создать нужный мне клиент apollo. Я попытался превратить свою функцию gqlClient в асинхронную функцию, но я получаю ошибку Unexpected reserved word 'await'. , когда пытаюсь использовать ее в gqlClient, даже когда я сделал функцию асинхронной.
Не могли бы вы, пожалуйста, помочь мне? Я уже несколько часов бьюсь над этим

 
function gqlClient() {
  // return the promise from currentSession and
  // return the client with token data if
  // the user is logged in
  return Auth.currentSession().then(function(data) {
    // Set the appropriate headers for the environment
    const jwt = data.accessToken.jwtToken;
    const headers = {};
    const authLink = setContext((_, { headers }) => ({
      headers: {
        ...headers,
        authorization: jwt ? `Bearer ${jwt}` : "",
      },
    }));
    const httpLink = createHttpLink({
      uri: 'http://localhost:8080/query',
    });
    return new ApolloClient({
      connectToDevTools: true,
      link: authLink.concat(httpLink),
      cache: new InMemoryCache(),
    });
  })
  .catch(function(err){
    // something def went wrong
    console.log(err);
    return new ApolloClient({cache: new InMemoryCache(),});
  });
};
 

и я хочу создать клиент apollo, который будет использоваться в моем компоненте react

 function App() {
  // retrieve current session
  var ListfulClient = gqlClient();
  console.log("listfulClient", ListfulClient)
  let [fontsLoaded] = useFonts({
    Arimo_400Regular,
    Arimo_400Regular_Italic,
    Arimo_700Bold,
    Arimo_700Bold_Italic,
  });
  if (!fontsLoaded) {
    return <AppLoading />;
  } else {
    return (
      <ApolloProvider client={ListfulClient}>
        <NavigationContainer>
          <Stack.Navigator>
            <Stack.Screen name="Listful" options={{ headerShown: false }} component={HomeTabs} />
            <Stack.Screen name="Settings" component={SettingsScreen} />
          </Stack.Navigator>
        </NavigationContainer>
      </ApolloProvider>
    );
  }
}
 

Ответ №1:

Вам придется сделать что-то подобное, использовать асинхронную функцию для ссылки аутентификации и передать оттуда токен. И передайте это клиенту по ссылке.

 const httpLink = createHttpLink({
  uri: 'http://localhost:8080/query',
});

const authLink = setContext(async (_, { headers }) => {
  const data = await Auth.currentSession();
  const jwt = data.accessToken.jwtToken;
  return {
    headers: {
      ...headers,
       authorization: jwt ? `Bearer ${jwt}` : "",
    },
  };
});

const client=new ApolloClient({
  connectToDevTools: true,
  link: authLink.concat(httpLink),
  cache: new InMemoryCache(),
});
 

В App.js

 var ListfulClient = client;
 

Это позволит убедиться, что токен передается в каждом запросе.

Комментарии:

1. это сработало! не могли бы вы, пожалуйста, объяснить эту часть кода, я понятия не имею, что здесь происходит: const authLink = setContext(async (_, { headers }) => {

2. Таким образом, в основном это вызовет функцию asyn, которая будет вызывать ваш getAuth каждый раз, когда запрос отправляется от клиента.