Given the following code:
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.log)
I get this error:
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.
What's going on?
This situation may also occur when the version of the graphql
module you have installed is different from the version installed and used by graphql-tools
.
I have found you can correct this by either:
Changing the version of graphql
in your project's package.json
file to match exactly what graphql-tools
depends on in its package.json
file.
Removing graphql
as a dependency and just installing graphql-tools
. Then you will automatically receive whatever graphql
module version that graphql-tools
installs (as long as you don't depend on any other packages that install another, conflicting version).
In other cases you might have the correct version, but it may be installed multiple times. You can use npm ls graphql
to see all the installed versions. Try running npm dedupe
to remove duplicate installations.
This happens because graphql-tools
module imports graphql
from its CommonJS module, while my code does it from the ES module. That is, each object in my own module comes from the ES module, while graph-tool
's not.
It's as easy as importing anything from graphql
importing the CommonJS module, and both objects from graphql
and graphql-tools
will be able to talk each together:
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.log)
My problem was both .js
an .mjs
graphql files are resolved due to wrong webpack configuration.
Root cause:
From TypeMapper.mjs
file in graphql-compose
, import statement does not have file extension and that was a failure on webpack bundle. In order to solve it, I required to add fullySpecified:false
into the webpack config.
{
test: /\.m?js/,
include: /node_modules/,
type: "javascript/auto",
resolve: {
fullySpecified: false
}
}
And I also modified resolve statement like
resolve: {
extensions: [".ts", ".js", ".mjs"] // that was the actual problem
}
Since fullySpecified
config has been set to false
, webpack was trying to resolve files without extension respect to the order of resolve.extentions
config. Due to the wrong order in that config, graphql
files with .js
ext were been resolving although all other files were using .mjs
one.
Solution:
Simply re-order resolve.extensions
config as
resolve: {
extensions: [".ts", ".mjs", ".js"]
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With