2016-06-23 15 views
1

GraphQLの新機能で、クエリからレコードを1つ取得する方法を理解しようとしています。GraphQLのリストからレコードを1つ取得する方法

{ 
    "data": { 
     "todos": null 
    } 
} 

私が間違っているのかわからないです:

これが私の現在のクエリの結果です。ここで

{ 
    "data": { 
     "todos": { 
      "id": 1, 
      "title": "wake up", 
      "completed": true 
     } 
    } 
} 

は私がGraphQLを学ぼうとして私が作成した私のコードです:私は、結果はこのようにしたいと思います。

schema.js:

var graphql = require('graphql'); 

var TODOs = [ 
    { 
    "id": 1, 
    "title": "wake up", 
    "completed": true 
    }, 
    { 
    "id": 2, 
    "title": "Eat Breakfast", 
    "completed": true 
    }, 
    { 
    "id": 3, 
    "title": "Go to school", 
    "completed": false 
    } 
]; 

var TodoType = new graphql.GraphQLObjectType({ 
    name: 'todo', 
    fields: function() { 
    return { 
     id: { 
     type: graphql.GraphQLID 
     }, 
     title: { 
     type: graphql.GraphQLString 
     }, 
     completed: { 
     type: graphql.GraphQLBoolean 
     } 
    }; 
    } 
}); 

var queryType = new graphql.GraphQLObjectType({ 
    name: 'Query', 
    fields: function() { 
    return { 
     todos: { 
     type: new graphql.GraphQLList(TodoType), 
     args: { 
      id: { type: graphql.GraphQLID } 
     }, 
     resolve: function (source, args, root, ast) { 
     if (args.id) { 
      return TODOs.filter(function(item) { 
      return item.id === args.id; 
      })[0]; 
      } 

      return TODOs; 
     } 
     } 
    } 
    } 
}); 

module.exports = new graphql.GraphQLSchema({ 
    query: queryType 
}); 

index.js:

var graphql = require ('graphql').graphql; 
var express = require('express'); 
var graphQLHTTP = require('express-graphql'); 
var Schema = require('./schema'); 

var query = 'query { todos(id: 1) { id, title, completed } }'; 
graphql(Schema, query).then(function(result) { 
    console.log(JSON.stringify(result,null," ")); 
}); 

var app = express() 
    .use('/', graphQLHTTP({ schema: Schema, pretty: true })) 
    .listen(8080, function (err) { 
    console.log('GraphQL Server is now running on localhost:8080'); 
}); 

私はルートディレクトリからnode index実行し、このコードを実行します。レコードIDによって返される特定のレコードを取得するにはどうすればよいですか?

答えて

3

あなたのqueryTypeのtodosフィールドに間違ったタイプがあります。 TodoTypeのリストではなく、TodoTypeである必要があります。 GraphQLはリストを表示することを期待しているのでエラーが発生していますが、リゾルバは単なる値を返しています。

ちなみにgraphiql: trueオプションをgraphqlHTTPに渡すことをお勧めします。GraphiQLを使用してスキーマを探索してクエリを作成できます。

+0

ありがとうございます!リストとリスト内の単一の値に対して異なるフィールドを作成するのが一般的ですか?たとえば、リストを返すリゾルバを持つ 'todos'フィールドと、リストから単一のアイテムを返すリゾルバを持つ' todo'フィールドはありますか? – Mdd

+1

はい、一般に、さまざまなタイプのデータを返すものが必要な場合は、別のフィールドを宣言する必要があります。こうすることで、引数が異なる場合でも、同じクエリが常に同じ形状のデータを返すことが保証されます。 – stubailo

関連する問題