错误:无法从另一个模块或领域使用GraphQLSchema“ [object GraphQLSchema]”

时间:2018-10-03 21:26:57

标签: javascript node.js ecmascript-6 graphql graphql-js

给出以下代码:

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)

我收到此错误:

  

错误:无法从另一个使用GraphQLSchema“ [object GraphQLSchema]”   模块或领域。

     

确保仅在“ graphql”的一个实例   node_modules目录。如果不同版本的“ graphql”是   其他依赖模块的依赖关系,请使用“分辨率”来确保   仅安装了一个版本。

这是怎么回事?

4 个答案:

答案 0 :(得分:8)

当您安装的graphql模块的版本与graphql-tools安装和使用的版本不同时,也会发生这种情况。

我发现您可以通过以下任一方法纠正此问题:

  1. 更改项目graphql文件中package.json的版本,使其与graphql-tools文件中package.json所依赖的文件完全匹配。

  2. 删除graphql作为依赖项,然后仅安装graphql-tools。然后,您将自动收到graphql安装的任何graphql-tools模块版本(只要您不依赖于安装任何其他冲突版本的其他软件包)。

在其他情况下,您可能具有正确的版本,但可能已安装多次。您可以使用npm ls graphql查看所有已安装的版本。尝试运行npm dedupe删除重复的安装。

答案 1 :(得分:2)

发生这种情况是因为graphql-tools模块从其CommonJS模块导入graphql,而我的代码是从ES模块执行的。也就是说,我自己的模块中的每个对象都来自ES模块,而graph-tool不是。

解决方案

就像从graphql导入CommonJS模块一样简单,并且graphqlgraphql-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.log)

答案 2 :(得分:0)

我的问题是 .js.mjs graphql 文件都因 webpack 配置错误而得到解决。

根本原因:

TypeMapper.mjs 中的 graphql-compose 文件,import 语句没有文件扩展名,这是 webpack 包的失败。为了解决这个问题,我需要将 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 ext 正在解析。

解决方案:

只需将 resolve.extensions 配置重新排序为

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

答案 3 :(得分:0)

当我的 .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