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

Posted

技术标签:

【中文标题】错误:无法使用来自另一个模块或领域的 GraphQLSchema“[object GraphQLSchema]”【英文标题】:Error: Cannot use GraphQLSchema "[object GraphQLSchema]" from another module or realm 【发布时间】:2019-03-09 04:59:39 【问题描述】:

给定以下代码:

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”是 其他依赖模块的依赖关系,使用“解决方案”来确保 只安装了一个版本。

发生了什么事?

【问题讨论】:

【参考方案1】:

这是因为 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】:

当您安装的graphql模块的版本与graphql-tools安装使用的版本不同时,也可能出现这种情况。

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

    在项目的 package.json 文件中更改 graphql 的版本以完全匹配 graphql-tools 在其 package.json 文件中所依赖的内容。

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

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

【讨论】:

这对我有用,ls 命令给了我上下文,但dedupe 清理了它。【参考方案3】:

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

根本原因:

graphql-compose 中的TypeMapper.mjs 文件,import 语句没有文件扩展名,这是在 webpack 包上失败。为了解决这个问题,我需要在 webpack 配置中添加fullySpecified:false


  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 ext 的文件正在解析,尽管所有其他文件都使用 .mjs 一个。

解决方案:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于错误:无法使用来自另一个模块或领域的 GraphQLSchema“[object GraphQLSchema]”的主要内容,如果未能解决你的问题,请参考以下文章

无法使用来自另一个模块或领域的 GraphQLObjectType \"Query\"

使用npm链接时,无法从其他模块或领域使用GraphQLSchema“[object GraphQLSchema]”

错误 TS4058:导出函数的返回类型具有或正在使用来自外部模块 Y 的名称 X,但无法命名

无法使用 graphq-request 表示嵌套对象输入类型的数组

来自另一个路径的模型类在 NativeScript 中引发错误调用模块

来自另一个模块的组件上的 Angular 指令输入会导致错误