У меня нет UI-фреймворка. Простой скрипт Nodejs, где мне нужно запросить GraphQL.
Коды:
const ApolloClient = require('apollo-client')
const client = new ApolloClient()
Сообщение об ошибке:
TypeError: ApolloClient is not a constructor
Пакет.json:
{
...
"dependencies": {
"apollo-client": "^2.4.13",
"graphql": "^14.1.1",
"graphql-tag": "^2.10.1"
},
}
Узел: v8.9.4
Я некоторое время гуглил, у людей есть эта проблема, в основном потому, что ApolloClient is no longer in react-apollo. You have to import it from 'apollo-client'
И я импортирую из apollo-client как const ApolloClient = require('apollo-client')
Любые идеи? Спасибо!





Если вы используете require, вы можете импортировать его следующим образом:
const ApolloClient = require('apollo-client').default
или вот так
const { ApolloClient } = require('apollo-client')
В противном случае вы импортируете весь модуль, который сам по себе не является конструктором.
Для людей, которым нравится, как я использую Node require, и которые просто хотят, чтобы он работал.
Пакеты:
npm install graphql apollo-client apollo-cache-inmemory apollo-link-http node-fetch --save
Коды:
const fetch = require('node-fetch')
const { createHttpLink } = require('apollo-link-http')
const { InMemoryCache } = require('apollo-cache-inmemory')
const { ApolloClient } = require('apollo-client')
const gql = require('graphql-tag')
const httpLink = createHttpLink({
uri: 'https://api.github.com/graphql',
fetch: fetch
})
const client = new ApolloClient({
link: httpLink,
cache: new InMemoryCache()
})
const query = gql`
query {
viewer {
login
}
}
`
client.query({
query
}).catch((error) => {
console.info(error)
done()
})
Ответ ошибочен, так как вам нужно добавить Authorization: bearer YOURTOKEN в заголовок запроса, но это другое дело.
Благодаря этому отвечать
У меня есть связанная проблема, хотя я использую node --experimental-modules, а не CommonJS. Я использую apollo-client версию 2.6.x и версию узла 12.x, так что это может измениться.
Вот как я пытался импортировать:
import { default as ApolloClient } from 'apollo-client';
const client = new ApolloClient();
Причина, по которой это не работает, заключается в том, что --experimental-modules по-прежнему импортирует версию CommonJS данного модуля, хотя package.json имеет поле "module", указывающее на точку входа ESM. Это происходит потому, что поддержка модулей EcmaScript в Node 12+ зависит либо от поля "type" в package.json, либо от расширения файла «сценарий Майкла Джексона» (.mjs). И использование именованного импорта с CommonJS не поддерживается: https://nodejs.org/api/esm.html#esm_compatibility_with_commonjs_only_versions_of_node_js
Итак, как исправить? Есть два подхода:
"type": "module" в package.jsonesmВот обходной путь:
import apolloClient from 'apollo-client';
const { ApolloClient } = apolloClient;
Бонус: полный пример
import nodeFetch from 'node-fetch';
global.fetch = nodeFetch;
import apolloClient from 'apollo-client';
const { ApolloClient } = apolloClient;
import apolloInMemoryCache from 'apollo-cache-inmemory';
const { InMemoryCache } = apolloInMemoryCache;
import apolloHttpLink from 'apollo-link-http';
const { HttpLink } = apolloHttpLink;
const cache = new InMemoryCache();
const link = new HttpLink({
uri
});
const client = new ApolloClient({
cache,
link
});
Это не очень красиво. Отсюда два пути:
esm, который не побуждает экосистему переключаться на собственный узел ESM из CommonJS."type": "module" и поместить точку входа esm в "main" в package.json в качестве критического изменения. Работайте с сопровождающими для поддержки временной совместимости и путей миграции. Разветвите модули и тем временем поддерживайте нативные версии ESM.Мы можем передать fetch в качестве опции для Http Link и удалить global.fetch, вот полный пример:
import fetch from 'node-fetch';
import apolloClient from 'apollo-client';
import apolloInMemoryCache from 'apollo-cache-inmemory';
import apolloHttpLink from 'apollo-link-http';
import gql from 'graphql-tag';
const { ApolloClient } = apolloClient;
const { InMemoryCache } = apolloInMemoryCache;
const { HttpLink } = apolloHttpLink;
const uri = 'https://countries.trevorblades.com/';
const link = new HttpLink({ uri, fetch });
const cache = new InMemoryCache();
const client = new ApolloClient({ link, cache });
const query = gql`
query {
countries {
name
}
}
`;
client
.query({ query })
.then((result) => console.info(result.data));