Использование ApolloClient с node.js."выборка не найдена глобально и сборщик не пройден" - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь использовать клиент Apollo на сервере node.js для взаимодействия с другим API GraphQL, используя следующий код:

import fetch from 'node-fetch'
import { createHttpLink } from 'apollo-link-http'

import ApolloClient from 'apollo-boost'
import { API_URL } from '...'

const client = new ApolloClient({
  link: createHttpLink({
    uri: API_URL,
    fetch: fetch,
  }),
})

, что приводит к следующей ошибке:

module initialization error: Error
fetch is not found globally and no fetcher passed, to fix pass a fetch for
your environment like https://www.npmjs.com/package/node-fetch.

For example:
import fetch from 'node-fetch';
import { createHttpLink } from 'apollo-link-http';

const link = createHttpLink({ uri: '/graphql', fetch: fetch });
at Object.checkFetcher (/var/task/node_modules/apollo-link-http-common/lib/bundle.umd.js:78:19)
at createHttpLink (/var/task/node_modules/apollo-link-http/lib/bundle.umd.js:32:30)
at new HttpLink (/var/task/node_modules/apollo-link-http/lib/bundle.umd.js:203:38)
at new DefaultClient (/var/task/node_modules/apollo-boost/lib/index.js:80:24)

Я понимаю, что по умолчанию клиент Apollo ожидает запуска в контексте браузера, где будет доступен метод fetch, и что в файле node.js мне нужно заполнить или иным образом предоставить метод fetch, ноУ меня возникли проблемы с выяснением, как именно это сделать.

Следуя примеру кода на https://www.apollographql.com/docs/link/#apollo-client, кажется, что я должен быть в состоянии передать эту информацию с помощью опции link и читатьИсходный код apollo-boost, по-видимому, предполагает, что вы можете передать эту информацию, используя fetcherOptions, но ни одно из этих решений не работает.

Может кто-нибудь предоставить пример кода для инициализации клиента Apollo в файле node.jsсо сборщиком?

Для справки вот мой package.json

{
  "name": "API-Service",
  "version": "1.0.0",
  "description": "",
  "private": true,
  "scripts": {},
  "dependencies": {
    "apollo-boost": "^0.1.6",
    "apollo-link-http": "^1.5.4",
    "graphql": "^0.13.2",
    "babel-polyfill": "^6.26.0",
    "json-rules-engine": "^2.1.0",
    "node-fetch": "^2.1.2",
    "mysql": "^2.15.0"
  }
}

Ответы [ 4 ]

0 голосов
/ 09 августа 2019

Вы можете добавить опцию fetch непосредственно к ApolloClient из apollo-boost.Вот пример кода

Ссыл.https://www.apollographql.com/docs/react/essentials/get-started/#configuration-options

import ApolloClient from 'apollo-boost';
import fetch from 'node-fetch';

const client = new ApolloClient({
    fetch: fetch
});

Протестировано с apollo-boost версия 0.4.3

0 голосов
/ 06 июня 2018

Если вы по-прежнему хотите использовать Apollo Boost в Node.js, но вам нужно многократно заполнить собственный API выборки браузера, попробуйте cross-fetch .Я использовал его для своего минимального примера над здесь .И вот как это можно использовать после установки:

import 'cross-fetch/polyfill';
import ApolloClient from 'apollo-boost';

const client = new ApolloClient({
  uri: 'https://api.domain.com/graphql',
});
0 голосов
/ 12 августа 2018

Вы можете использовать whatwg-fetch polyfill:

yarn add whatwg-fetch

Инструкции по установке зависят от вашего использования (например, Babel, Webpack и т. Д.) И находятся по предоставленной ссылке.

В моем случае мне понадобился полифилл для моих тестов Jest, поэтому я просто поместил это в свой файл настроек теста:

import 'whatwg-fetch';
0 голосов
/ 05 июня 2018

Оказывается, что ApolloClient, предоставляемый библиотекой apollo-boost, не принимает опцию link.Переключение на использование ванили apollo-client позволяет вам указать механизм извлечения.

Хотя apollo-boost и apollo-client оба экспортируют ApolloClient в документы, они принимают совершенно разные опции.

import fetch from 'node-fetch'
import { createHttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'

import ApolloClient from 'apollo-client'
import { API_URL } from '...'

const client = new ApolloClient({
  link: createHttpLink({
    uri: API_URL,
    fetch: fetch,
  }),
  cache: new InMemoryCache(),
})
...