ApolloClient не является конструктором (apollo-клиент с nodejs)

У меня нет 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')

Любые идеи? Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
5 057
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Если вы используете 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

Итак, как исправить? Есть два подхода:

  1. Попросите авторов клиента apollo опубликовать пакет ESM с полем "type": "module" в package.json
  2. Используйте обходные пути в исходном коде
  3. Используйте esm

Вот обходной путь:

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
  });

Это не очень красиво. Отсюда два пути:

  1. Переключитесь с экспериментальных модулей на механизм загрузки esm, который не побуждает экосистему переключаться на собственный узел ESM из CommonJS.
  2. Создайте запрос на включение в репозиторий Apollo и все его зависимости, чтобы поместить "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));

Другие вопросы по теме