2016-06-23 6 views
1

Ich bin sehr neu in GraphQL und versuchen zu verstehen, wie man 1 Datensatz von Abfrage erhalten.Wie bekomme ich 1 Datensatz von einer Liste in GraphQL

Dies ist das Ergebnis meiner aktuellen Abfrage:

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

Ich bin nicht sicher, was falsch ist. Ich möchte das Ergebnis dieser sein:

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

Hier ist mein Code, die ich geschaffen habe, wie ich versuche, GraphQL zu lernen.

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'); 
}); 

diesen Code auszuführen ich nur node index aus dem Stammverzeichnis ausführen. Wie kann ich einen bestimmten Datensatz erhalten, der von der Datensatz-ID zurückgegeben wird?

Antwort

3

Sie haben den falschen Typ für das Todos-Feld Ihres queryType. Es sollte TodoType sein, keine Liste von TodoType. Sie erhalten einen Fehler, weil GraphQL erwartet, eine Liste zu sehen, aber Ihr Resolver gibt nur einen einzelnen Wert zurück.

Übrigens, ich schlage vor, die Option graphiql: true an graphqlHTTP übergeben, die Sie GraphiQL verwenden können, um Ihr Schema zu erkunden und Abfragen zu machen.

+0

Danke! Ist es üblich, verschiedene Felder für Listen und für einen einzelnen Wert in der Liste zu erstellen? Zum Beispiel ein Todos-Feld mit einem Resolver, der eine Liste zurückgibt, und ein Todo-Feld mit einem Resolver, der ein einzelnes Element aus der Liste zurückgibt. – Mdd

+1

Ja, im Allgemeinen, wenn Sie möchten, dass verschiedene Datentypen zurückgegeben werden, müssen Sie verschiedene Felder dafür angeben. Auf diese Weise können Sie sicher sein, dass dieselbe Abfrage immer dieselbe Form von Daten zurückgibt, auch wenn die Argumente unterschiedlich sind. – stubailo

Verwandte Themen