我正在尝试设置一个快速的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是否使用它自己的版本?我该如何检查?我是节点的新手,有没有办法检查实例?
答案 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
`);