2016-07-03 9 views
4

私はセットアップをしようとしています高速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." 
    } 
    ] 
} 

をI私が間違っていることがわからない。これと関連がある場合は、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", 

私は一つだけgraphqlがnode_modulesフォルダにあることを確認しました。 graphqlは、共有グローバルインスタンスのように、すべてのモジュールで同じINSTANCEを期待していますか? express-graphqlは独自のバージョンを使用していますか?どうすれば確認できますか?私はノードに新しいです、インスタンスをチェックする方法はありますか?

答えて

4

私はこれがGraphQLの問題ではないと思っていますが、JSでどのようにrequireとexportを使用しているかに問題があります。問題は、おそらくです:

VARスキーマは、=が必要です( './ /モデル/ graphql /スキーマを構築')

=新しいgraphql.GraphQLSchema({ クエリ

VARスキーマと一緒に:RootQuery });

exports.default =スキーマ。

エクスポートしているのと同じ値をインポートしていません。 module.exports = Schemaとしてスキーマをエクスポートしたり、&維持Graphqlサービス(主に自分のスキーマ)を実装すると思うならSchema = require("./...").default

+0

2番目のファイルは、トランスバーター出力の結果で、Babelのようです。最初のファイルもBabelを使っていますか? 1つのファイルでES6のインポート/エクスポート構文を使用していて、別のファイルでrequire()を直接使用しているということがあります。私はこの種の間違いを避けるために、1つの構文すべてを使うか、他のすべてを使うことをお勧めします。 –

+0

ありがとうございました!あなたは正しいです、私はバベルのすべてではなく、私たちの生産環境から来たボイラープレートのコードだったメインファイルだけで、私はそれを残しました。一度私が先に進んでそれをes6で書き直し、それをすべて残して、すべてがうまくいった。このものは初心者のために追いつくのが難しいです。ヘルプをよろしく! – Coco

0

Also ensure that there are not multiple versions of GraphQL installed in your node_modules directory.

エラーが示すように、これは、おそらくnode_modulesディレクトリに複数のGraphQLのコピーが関係している可能性があります。あなたはそれを確認しましたか?複数のコピーがある場合は、npmバージョン2を使用している場合はnpm dedupeを実行して解決できる場合があります.npm 3を使用している場合、おそらく2種類の異なるバージョンのgraphqlモジュールをインストールしている可能性があります。

どちらの方法でも、コンパイルステップの後で、express-graphqlとスキーマが両方ともgraphqlモジュールの同じコピーを指していることを確認する必要があります。

+0

こんにちは、お返事ありがとうございます - 私はnpmバージョン3.8.6を持っています - 私はnode_modulesフォルダにgraphqlのコピーを1つしか持っていません。どこにでもインストールできますか?多分express-graphqlの依存として?インスタンスがどこから引き出されているかを示す方法はありますか? – Coco

-1

として、それをインポートし、graphqlyを見てくださいどちらか試してみてください。

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 
`); 
関連する問題