GraphQL: не удается прочитать заголовки ответов в клиенте Apollo

#graphql #apollo #apollo-client #apollo-server #response-headers

#graphql #apollo #apollo-client #apollo-сервер #заголовки ответов

Вопрос:

Я хотел бы прочитать заголовок ответа с помощью клиента Apollo, но не могу.

Я использую сервер Apollo и клиент Apollo для взаимодействия с GraphQL API, и я хотел бы отправлять заголовки туда и обратно. Я настроил клиент так, чтобы он отправлял заголовок x-client-version, и я настроил сервер так, чтобы иногда он также отвечал с тем же заголовком.

Проблема в том, что когда я пытаюсь прочитать заголовок x-client-version (или любой другой заголовок на самом деле) с помощью Apollo client, я получаю undefined. Ниже я настроил некоторые дополнительные программы на основе примеров, которые я нашел в Интернете, и даже пошаговых руководств YouTube:

 const clientVersionAfterware = new ApolloLink((operation, forward) =>
  forward(operation).map(response => {
    const {
      response: { headers },
    } = operation.getContext();
    console.log(headers);
    if (headers) {
      const token = headers.get("x-client-version");
      console.log(token);
      if (token) {
        localStorage.setItem("clientVersion", token);
      }
    }

    return response;
  }),
);
  

Присоедините его к цепочке ссылок:

     const httpLink = handleErrors.concat(
  clientVersionAfterware.concat(new HttpLink(linkOptions)),
);
const batchHttpLink = handleErrors.concat(
  clientVersionAfterware.concat(
    new BatchHttpLink({ ...linkOptions, batchInterval: 10 }),
  ),
);
  

В конечном счете подключение ссылок в конструкторе ApolloClient:

 new ApolloClient({
    link: split(
      ({ operationName = "" }) => operationName.startsWith("findOrCreate"),
      httpLink,
      batchHttpLink,
    ),
    cache,
    ...opts,
  });
  

Я слышал, что объект headers пуст, но заголовки все еще можно прочитать, но, по моему опыту, это определенно неверно. Я вижу, что сервер действительно возвращает x-client-version заголовок, который я ожидаю прочитать:

Заголовки ответов Chrome

Я думал, что, возможно, обновление моих пакетов поможет, но этого не произошло. Версии, которые я использую:

 "apollo-cache-inmemory": "^1.5.1",
"apollo-client": "^2.5.1",
"apollo-link-batch-http": "^1.2.4",
"apollo-link-error": "^1.1.2",
"apollo-link-http": "^1.5.11",
  

Я чего-то не понимаю? Заранее спасибо!

Ответ №1:

Я понял это.

Оказывается, обновления apollo-client недостаточно. Я обновил следующие пакеты, и теперь объект headers заполнен:

 "apollo-link-batch-http": "^1.2.9",
"apollo-link-error": "^1.1.8",
"apollo-link-http": "^1.5.12",
  

Я уверен, что вам не нужно обновлять apollo-link-error, но двух других должно быть достаточно (особенно apollo-link-http).

Ответ №2:

Мне не хватало Access-Control-Expose-Headers конечной точки / graphql:

   app.use((req, res, next) => {
    res.append("x-version-backend", `${BUILD_VERSION}`);
    res.append("Access-Control-Expose-Headers", "x-version-backend");
    next();
  });
  

После этого я мог видеть свои заголовки:

 const responseLogger = new ApolloLink((operation, forward) => {
    return forward(operation).map(result => {
      const headers = operation.getContext().response.headers;
      const backendVersion = headers.get("x-version-backend");
      console.info(`x-version-backend:${backendVersion}`);
      return resu<
    });
  });