Использование ApolloClient с node.js. "выборка не найдена глобально, и никакой приманщик не прошел"
Я пытаюсь использовать клиент 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"
}
}
Ответы
Ответ 1
Оказывается, ApolloClient
предоставленный библиотекой apollo-boost
, не принимает link
. Переключение на использование vanilla 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(),
})
Ответ 2
Если вы по-прежнему хотите использовать Apollo Boost в Node.js, но вам необходимо многократно заполнить собственный API выборки браузера, попробуйте перекрестную выборку. Я использовал это для своего минимального примера над здесь. И как это можно использовать после его установки:
import 'cross-fetch/polyfill';
import ApolloClient from 'apollo-boost';
const client = new ApolloClient({
uri: 'https://api.domain.com/graphql',
});
Ответ 3
Вы можете добавить опцию 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
Ответ 4
Вы можете использовать whatwg-fetch
:
yarn add whatwg-fetch
Инструкции по установке зависят от вашего использования (например, Babel, Webpack и т.д.) И находятся в предоставленной ссылке.
В моем случае мне понадобился полиполк для моих тестов Jest, поэтому я просто поместил это в свой тестовый файл настроек:
import 'whatwg-fetch';