Извлечение контекста без заголовка с сервера Apollo

#javascript #apollo #react-apollo #apollo-client #apollo-server

#javascript #apollo #реагировать-apollo #apollo-клиент #apollo-сервер

Вопрос:

Я продолжаю видеть примеры настройки контекста на клиенте Apollo следующим образом :

 new ApolloClient({
    uri: '...',
    request(operation) {
      const currentUser = readStore<CurrentUser>("currentUser");
      currentUser amp;amp;
        operation.setContext({
          headers: { authorization: currentUser.token },
          other: "things"
        });
    }
  });
}
  

С вещами, которые идут в заголовки запроса, и «другими» вещами. Тем не менее, после более чем 2 часов исследований я не смог найти ни одного примера того, что другие данные контекста извлекаются на другом конце, на сервере Apollo.

Похоже, что все примеры касаются токенов авторизации, но как я могу получить остальные, скажем, с помощью apollo-server-express ?

Вот что у меня есть на данный момент :

 const apollo = new ApolloServer({
  typeDefs,
  resolvers,
  context({ req }): Context {
    const currentUser =
      (req.headers.authorization amp;amp;
        (jwt.verify(
          req.headers.authorization,
          process.env.JWTSIGN
        ) as Context["currentUser"])) ||
      null;

    // Ok for req.headers.authorization, how to I get "other: things" ?

    return {
      ip: req.ip,
      currentUser
    };
  }
});
  

context Функция здесь получает только запрос и объект res из Express. После некоторых журналов, похоже, он не содержит нужных мне данных.

Спасибо.

Ответ №1:

Единственная причина, по которой заголовки отображаются совместно в примере, которым вы поделились, заключается в том, что ApolloClient использует headers значение внутри своего контекста для заполнения HTTP-заголовков, которые он отправляет при выполнении запроса. Затем эти заголовки анализируются express и становятся доступными для req объекта. Контекст, используемый ApolloClient , является строго клиентским. Контекст, используемый ApolloServer , является строго серверным. Вы не можете использовать контекст ApolloClient для передачи произвольных значений на ваш сервер — для этого вы должны использовать заголовки или аргументы внутри вашего запроса GraphQL.