Apollo-link-rest: "Заголовки не определены" возникает при использовании apollo-link-rest в программе weixin mini.

Созданный на 16 июл. 2019  ·  25Комментарии  ·  Источник: apollographql/apollo-link-rest

  • [x] имеет репродукцию

Когда мы пытаемся использовать apollo-link-rest в программе weixin mini, мы столкнулись с проблемой, которая вызвала ошибку, как показано ниже:

 Headers is not defined 
 ReferenceError: Headers is not defined

Поскольку я нашел исходный код в RestLink.ts, он пытается найти заголовки, но абсолютно в среде weixin заголовков нет, так что может ли кто-нибудь помочь предоставить какой-нибудь взлом или решения для решения этой проблемы? Очень признателен, если вы могли бы помочь, спасибо.

help wanted 🛠 question❔

Самый полезный комментарий

Вот что у меня сработало:

import clientFetch from 'unfetch';
import serverFetch, { Headers as ServerHeaders } from 'node-fetch';

const client = typeof document !== 'undefined';
global.Headers = client ? global.Headers : ServerHeaders;
const customFetch = client ? clientFetch : serverFetch;

const acmeLink = new JsonApiLink({
  …
  credentials: 'same-origin',
  customFetch,
});

Все 25 Комментарий

Привет @ Janice1114 , я не знаком с weixin, но, может быть, вы можете использовать полифил заголовков?

Часто, если заголовки недоступны, Fetch также будет недоступен. Вот полифилл, который может работать для обоих: https://github.com/bitinn/node-fetch

Привет @fbartho , спасибо за быстрый ответ. Я пытался использовать полифил, чтобы включить выборку заголовков, но все равно получаю ошибки.

И я обнаружил, что в weixin для выборки используется wx.request, который не поддерживает переменную, связанную с окном, поэтому я боюсь, что полифилл не будет работать.

И могу ли я узнать, есть ли какой-нибудь хакер или реализации, которые помогут пропустить цикл заголовков в исходном коде apollo-link-rest? Или вы могли бы дать несколько индивидуальных опций, подходящих под другой сценарий?

Вы можете использовать параметр customFetch для ApolloLinkRest, чтобы предоставить функцию-оболочку, эта функция-оболочка может брать заголовки на основе окна из Polyfill и сглаживать их в традиционный хэш объекта.

Что-то вроде следующего (непроверено, написано в моем браузере):

function customFetch(url, options) {
   const headers = options.headers.entries().reduce((accumulator, h) => { accumulator[h[0]] = h[1];  return accumulator;}, {})
   return fetch(url, {…options, headers});
}
// Elsewhere: new RestLink({ customFetch, ...

Большое спасибо за ваш любезный ответ, я постараюсь использовать этот полифилл в разработке weixin.

И когда я прочитал исходный код в RestLink.ts, он попытается получить доступ к заголовкам, которые недоступны в weixin. Он может назначать переменные в global .

Поэтому мне интересно, могут ли какие-либо пользовательские или переопределенные настройки применяться во время процесса конструктора RestLink?

Еще раз с наилучшими пожеланиями за такие замечательные советы.

Привет, @fbartho ,, чтобы исправить эту проблему в weixin и соответствующем специальном браузере, я создал PR, как показано ниже:
Исправление проблемы с заголовками

Не могли бы вы помочь и проверить, доступен ли PR кода для слияния с мастером
Большое спасибо, если это может помочь.

У меня такая же проблема в "next": "^9.0.3"

У меня также возникла эта проблема со следующей версией ^8.1.0 . Для моего графического API я использую isomorphic-unfetch , версию ^3.0.0 для полифила следующим образом:

import fetch from 'isomorphic-unfetch'
const graphLink = createHttpLink({ uri, fetch })

Но использование того же пакета для полифила с остальной ссылкой не сработало:

const restLink = new RestLink({
  uri,
  customFetch: fetch,
})

Я также попробовал node-fetch используя ваш метод customFetch:

import fetch from 'node-fetch'

function customFetch(url, options) {
  const headers = options.headers.entries().reduce((accumulator, h) => {
    accumulator[h[0]] = h[1]
    return accumulator
  }, {})
  return fetch(url, { ...options, headers })
}

const restLink = new RestLink({
  uri: CONTENTFUL_CONTENT_DELIVERY_API,
  customFetch,
})

В обоих случаях я получил ReferenceError: Headers is not defined при следующем запуске в режиме разработки.

Мне понравилась идея здесь, я был бы рад, если бы вы могли дать какое-то направление для реализации в серверных средах. Спасибо!

Вы можете полифилить Headers API, по-прежнему используя свой собственный customFetch API!

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

@fbartho Несколько примеров кода были бы замечательны, когда у вас есть шанс! Я попытался это сделать, но безуспешно. Спасибо!

import * as Polyfillheaders from 'fetch-headers'
import fetch from 'isomorphic-unfetch'

// hook in the Headers polyfill for your environment!
global.Headers = global.Headers || Polyfillheaders;

function customFetch(url, options) {
  const headers = options.headers.entries().reduce((accumulator, h) => {
    accumulator[h[0]] = h[1]
    return accumulator
  }, {})
  return fetch(url, { ...options, headers })
}

const restLink = new RestLink({
  uri: CONTENTFUL_CONTENT_DELIVERY_API,
  customFetch,
})

Что-то вроде вышеперечисленного может помочь @ 2wheelcoder

Спасибо! Я доложу здесь, когда у меня будет возможность попробовать.

@fbartho Привет! Я столкнулся с этой проблемой на ios 9.3.5. Я попытался импортировать полифилл fetch-headers но не работал.
Я обнаружил, что экземпляр заголовка из fetch-headers не имеет метода forEach (см. Ниже).
image

Есть ли другие решения?

@fbartho Привет! Я столкнулся с этой проблемой на ios 9.3.5. Я попытался импортировать полифилл fetch-headers но не работал.
Я обнаружил, что экземпляр заголовка из fetch-headers не имеет метода forEach (см. Ниже).
image

Есть ли другие решения?

Я решил эту проблему с помощью полифила fetch .

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

Я не смог решить эту проблему с помощью полифилла. Я пробовал изоморфную выборку, изоморфную выборку, выборку заголовков и т. Д. И всегда сталкивался с проблемой, что current.forEach не определено или TypeError: Right-hand side of 'instanceof' is not an object . Любая помощь?

@VinSpee Вы когда-нибудь пробовали этот полифилл для выборки .

@lintuming да, но на сервере он не работает.

@VinSpee Может быть, вы можете использовать это , кажется, у них есть метод forEach .
image
Надеюсь, это сработает.

@lintuming спасибо за попытку помочь. С этим я получаю:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

кажется запутанной паутиной проблем 🤣

@VinSpee Извините, я понятия не имею, почему это произошло, но я думаю, что это могло бы помочь:
https://stackoverflow.com/questions/7042340/error-cant-set-headers-after-they-are-sent-to-the-client

Вот что у меня сработало:

import clientFetch from 'unfetch';
import serverFetch, { Headers as ServerHeaders } from 'node-fetch';

const client = typeof document !== 'undefined';
global.Headers = client ? global.Headers : ServerHeaders;
const customFetch = client ? clientFetch : serverFetch;

const acmeLink = new JsonApiLink({
  …
  credentials: 'same-origin',
  customFetch,
});

@VinSpee Я столкнулся с той же проблемой, и я попытался исправить эту проблему с помощью вашего решения, но мне это не удалось.
Не могли бы вы поделиться своим рабочим кодом?

Спасибо @VinSpee - это именно то, что мне нужно

Мне удалось решить эту проблему с помощью пользовательской выборки

import fetch from "isomorphic-fetch"

const restLink = new RestLink({
  uri: "https://...",
  customFetch: fetch,
  headers: {
    "Content-Type": "application/json",
  },
})

Решение @VinSpee сработало и для приложения Gatsby JS.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги