Схема GraphQL не импортируется


Я пытаюсь настроить сервер express 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;
А вот и мой пакет.json:
    "express": "^4.13.4",
    "express-graphql": "^0.5.3",
    "graphql": "^0.6.0",

Я проверил, что только один graphql находится в папке node_modules. Ожидает ли graphql один и тот же экземпляр во всех модулях, как общий глобальный экземпляр? Использует ли express-graphql собственную версию? Как это проверить? Я новичок в node, есть ли способ проверить экземпляры?

3 4

3 ответа:

Я не думаю, что это проблема GraphQL, но проблема с тем, как вы используете require и exports в JS. Проблема, вероятно, в следующем:

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

Вместе с

Var Schema = new graphql.GraphQLSchema({ запрос: RootQuery });

Экспорт.default = Schema;

Вы не импортируете то же самое значение, которое экспортируете. Попробуйте экспортировать схему как module.exports = Schema или импортировать ее как Schema = require("./...").default

Также убедитесь, что в вашем каталоге node_modules не установлено несколько версий GraphQL.

Как показывает ошибка, это, скорее всего, связано с более чем одной копией GraphQL в вашем каталоге node_modules. Вы это проверили? Если существует несколько копий, вы можете решить эту проблему, запустив npm dedupe, если вы используете npm версии 2. Если вы используете npm 3, то, скорее всего, вы установили две разные версии graphql модуль.

В любом случае, вы должны убедиться, что после этапа компиляции express-graphql и ваша схема указывают на одну и ту же копию модуля graphql.

Если вы думаете о реализации и обслуживании сервисов 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
`);