GraphQL架构不会导入

时间:2016-07-03 00:19:06

标签: express graphql

我正在尝试设置一个快速的GraphQL服务器。按照教程,我将以下内容放入服务器启动时如下:

//   ENTIRE SCHEMA IN MAIN FILE  THIS WORKS!!!

...
var graphql = require('graphql');

const RootQuery = new graphql.GraphQLObjectType({
  name: 'RootQuery',
  description: 'The root query',
  fields: {
    viewer: {
      type: graphql.GraphQLString,
      resolve() {
        return 'viewer!';
      }
    }
  }
});

const Schema = new graphql.GraphQLSchema({
  query: RootQuery
});

app.use('/graphql', graphqlHTTP({ schema: Schema }));
...

它有效,返回数据'查看器!但由于我不想要主文件中的所有内容,我尝试将此确切代码传输到另一个文件并将其导入为:

//THIS DOES NOT WORK
...
var Schema = require('./build/models/graphql/schema');
  app.use('/graphql', graphqlHTTP({ schema: Schema }));
...

我收到以下错误:

{
  "errors": [
    {
      "message": "Schema must be an instance of GraphQLSchema. Also ensure that there are not multiple versions of GraphQL installed in your node_modules directory."
    }
  ]
}

我不确定我做错了什么。如果这与它有任何关系,我在es6中写,然后在构建脚本中回溯到5。这是模式文件的构建:

// TRANSPILED SCHEMA

'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var graphql = require('graphql');

var RootQuery = new graphql.GraphQLObjectType({
  name: 'RootQuery',
  description: 'The root query',
  fields: {
    viewer: {
      type: graphql.GraphQLString,
      resolve: function resolve() {
        return 'viewer!';
      }
    }
  }
});

var Schema = new graphql.GraphQLSchema({
  query: RootQuery
});

exports.default = Schema;

这是我的package.json:

    "express": "^4.13.4",
    "express-graphql": "^0.5.3",
    "graphql": "^0.6.0",

我已经检查过node_modules文件夹中只有一个graphql。 graphql是否期望在所有模块中使用相同的INSTANCE,例如共享的全局实例? express-graphql是否使用它自己的版本?我该如何检查?我是节点的新手,有没有办法检查实例?

3 个答案:

答案 0 :(得分:4)

我不认为这是一个GraphQL问题,但是你在JS中使用require和exports的方式存在问题。问题可能是:

var Schema = require('./ build / models / graphql / schema')

一起

var Schema = new graphql.GraphQLSchema({   查询:RootQuery });

exports.default =架构;

您没有导入与导出相同的值。尝试将架构导出为module.exports = Schema或将其导入为Schema = require("./...").default

答案 1 :(得分:0)

  

还要确保node_modules目录中没有安装多个GraphQL版本。

如错误所示,这很可能与node_modules目录中的多个GraphQL副本有关。你检查过了吗?如果您有多个副本,则可以通过运行npm dedupe来解决此问题,如果您使用的是npm版本2.如果您正在使用npm 3,则很可能是您我安装了两个不同版本的graphql模块。

无论哪种方式,您都必须确保在编译步骤之后,express-graphql和您的架构都指向graphql模块的同一副本。

答案 2 :(得分:-1)

如果您认为实施&维护Graphql服务(主要是他们的模式),请查看graphqly。这是一个定义Graphql模式的示例代码:

import graphly from "graphqly";

const gBuilder = graphly.createBuilder();

// define types, inputs ... (in any order)
gBuilder.type("Products").implements("List").def(`
    products: [Product]!
`);

gBuilder.type("Product").def(`
    id: ID!
    name: String!
    link: String
    price: Int
`);

// we're too lazy to define a separate input, so we can `extend` other structure
gBuilder.input("ProductInput").ext("Product");

gBuilder.enum("ProductOrder").def(`
    PRICE_DESCENDING
    PRICE_ASCENDING
    NEWEST
`);