Схема 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 ответа:
Я не думаю, что это проблема 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. Вы это проверили? Если существует несколько копий, вы можете решить эту проблему, запустив
В любом случае, вы должны убедиться, что после этапа компиляции express-graphql и ваша схема указывают на одну и ту же копию модуляnpm dedupe
, если вы используете npm версии 2. Если вы используете npm 3, то, скорее всего, вы установили две разные версии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 `);