Ошибка: невозможно использовать GraphQLSchema "[объект GraphQLSchema]" из другого модуля или области

Учитывая следующий код:

import { graphql } from 'graphql'
import graphqlTools from 'graphql-tools'

const { makeExecutableSchema } = graphqlTools

const typeDefs = `
type Query {
   as: [A]
}

type A {
   x: Int,
   y: Int
}
`
const schema = makeExecutableSchema ({ typeDefs })

graphql(schema, '{ as { x, y } }').then(console.info)

Я получаю такую ​​ошибку:

Error: Cannot use GraphQLSchema "[object GraphQLSchema]" from another module or realm.

Ensure that there is only one instance of "graphql" in the node_modules directory. If different versions of "graphql" are the dependencies of other relied on modules, use "resolutions" to ensure only one version is installed.

В чем дело?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
12
0
6 359
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Это происходит потому, что модуль graphql-tools импортирует graphql из своего модуля CommonJS, а мой код делает это из модуля ES. То есть каждый объект в моем собственном модуле исходит из модуля ES, а graph-tool - нет.

Решение

Это так же просто, как импортировать что-либо из graphql, импортировав модуль CommonJS, и оба объекта из graphql и graphql-tools смогут общаться друг с другом:

import graphql_ from 'graphql/index.js'
import graphqlTools from 'graphql-tools'

const { graphql } = graphql_
const { makeExecutableSchema } = graphqlTools

const typeDefs = `
type Query {
   as: [A]
}

type A {
   x: Int,
   y: Int
}
`
const schema = makeExecutableSchema ({ typeDefs })

graphql(schema, '{ as { x, y } }').then(console.info)

Эта ситуация также может возникнуть, если версия установленного вами модуля graphql отличается от версии, установленной и используемой graphql-tools.

Я обнаружил, что вы можете исправить это одним из следующих способов:

  1. Изменение версии graphql в файле package.json вашего проекта, чтобы она точно соответствовала тому, от чего зависит graphql-tools в файле package.json.

  2. Удаление graphql как зависимости и просто установка graphql-tools. Затем вы автоматически получите ту версию модуля graphql, которую устанавливает graphql-tools (при условии, что вы не зависите от каких-либо других пакетов, устанавливающих другую конфликтующую версию).

В других случаях у вас может быть правильная версия, но она может быть установлена ​​несколько раз. Вы можете использовать npm ls graphql, чтобы увидеть все установленные версии. Попробуйте запустить npm dedupe, чтобы удалить повторяющиеся установки.

У меня это сработало, команда ls дала мне контекст, но dedupe очистил его.

jwknz 09.04.2020 11:30

Моя проблема заключалась в том, что файлы .js и .mjs graphql разрешены из-за неправильной конфигурации веб-пакета.

Первопричина:

Из файла TypeMapper.mjs в graphql-compose оператор импорта не имеет расширения файла, и это был сбой в пакете веб-пакетов. Чтобы решить эту проблему, мне потребовалось добавить fullySpecified:false в конфигурацию webpack.

{
  test: /\.m?js/,
  include: /node_modules/,
  type: "javascript/auto",
  resolve: {
    fullySpecified: false
  }
}

И я также изменил оператор разрешения, например

resolve: {
  extensions: [".ts", ".js", ".mjs"] // that was the actual problem
}

Поскольку для конфигурации fullySpecified задано значение false, webpack пытался разрешить файлы без расширения в соответствии с порядком конфигурации resolve.extentions. Из-за неправильного порядка в этой конфигурации файлы graphql с расширением .js были разрешены, хотя все остальные файлы использовали файл .mjs.

Решение:

Просто переупорядочьте конфигурацию resolve.extensions как

resolve: {
  extensions: [".ts", ".mjs", ".js"]
}

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

@<company-name>:registry=<registry-url>
//<artifactory-name>:_password=${PASSWORD}
//<artifactory-name>:username=${JFROG_USERNAME}
//<artifactory-name>:email=${YOUR_EMAIL}
//<artifactory-name>:always-auth=true

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