Учитывая следующий код:
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.
В чем дело?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это происходит потому, что модуль 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.
Я обнаружил, что вы можете исправить это одним из следующих способов:
Изменение версии graphql в файле package.json вашего проекта, чтобы она точно соответствовала тому, от чего зависит graphql-tools в файле package.json.
Удаление graphql как зависимости и просто установка graphql-tools. Затем вы автоматически получите ту версию модуля graphql, которую устанавливает graphql-tools (при условии, что вы не зависите от каких-либо других пакетов, устанавливающих другую конфликтующую версию).
В других случаях у вас может быть правильная версия, но она может быть установлена несколько раз. Вы можете использовать npm ls graphql, чтобы увидеть все установленные версии. Попробуйте запустить npm dedupe, чтобы удалить повторяющиеся установки.
Моя проблема заключалась в том, что файлы .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
У меня это сработало, команда
lsдала мне контекст, ноdedupeочистил его.