2015-08-22 1 views
3

Je suis en train de jouer avec GraphQL-JS en ce moment, le câblage jusqu'à un backend MariaDB.Type de streaming GraphQL?

J'ai compris comment retourner un jeu de résultats:

const queryType = new GraphQLObjectType({ 
    name: 'Query', 
    fields:() => ({ 
     users: { 
      type: new GraphQLList(userType), 
      resolve: (root, args) => new Promise((resolve, reject) => { 
       db.query('select * from users', (err, rows, fields) => { 
        if(err) return reject(err); 
        resolve(rows); 
       }); 
      }), 
     } 
    }) 
}); 

Ce qui est assez cool, mais le library I'm using me permet aussi stream results, ligne par ligne.

Est-ce que GraphQL a quelque chose pour faciliter cela?

Pour autant que je sache, GraphQLList attend un tableau complet, et je ne peux résoudre mon jeu de résultats qu'une seule fois, pas en utilisant un émetteur ou quelque chose.

Répondre

1

(Ce n'est pas vraiment une réponse complète, mais ne rentre pas dans un commentaire non plus)

Selon la spécification graphQL. il devrait être possible:

GraphQL fournit un certain nombre de scalaires intégrés, mais systèmes de type peut ajouter supplémentaires scalaires avec sens sémantique. Par exemple, un système GraphQL pourrait définir un scalaire appelé Time qui, bien que sérialisé en tant que chaîne , promet de se conformer à ISO-8601. Lorsque vous interrogez un champ de type Time, vous pouvez ensuite compter sur la capacité d'analyser le résultat avec un analyseur ISO-8601 et d'utiliser une primitive spécifique au client pour l'heure. Un autre exemple d'un scalaire personnalisé potentiellement utile est Url, qui numérise en tant que chaîne, mais le serveur garantit qu'il s'agit d'une URL valide.

Ainsi, la structure devrait ressembler à ceci:

var myStream = new GraphQLScalarType({ 
    name: "myStream", 
    serialize: ... 
    parseValue: ... 
    parseLiteral: ... 
    }); 
} 

Maintenant, je suppose que vous pouvez essayer de retourner les promesses/cours d'eau et voir ce qui se passe, mais je ne pense pas qu'il est encore pris en charge. Beaucoup de gens le demandent, et je pense avoir vu un commentaire de la part de l'équipe de graphQL qui dit qu'ils sont en train de se pencher là-dessus (on ne le retrouve malheureusement pas).

Une opinion personnelle, mais si elle ne peut pas être modifiée sans incorporer ce comportement dans le noyau de graphQL, peut montrer que graphQL tel qu'il est aujourd'hui n'est pas si flexible.

1

Il n'est pas possible de diffuser les résultats avec un serveur GraphQL de base car il possède une architecture client-serveur (vous envoyez une requête HTTP et récupérez la réponse HTTP).

C'est possible avec les abonnements, cependant. Ils étaient recently added à GraphQL (voir the story behind).

+0

Je pense que quand j'ai écrit ce que je voulais 'resolve' pour permettre les types de retour du générateur ou un autre cours d'eau. La réponse HTTP ne sera pas envoyée tant que le générateur/flux n'aura pas été épuisé/fermé. Je vais vérifier les liens que vous avez publiés. Les réponses en streaming seraient encore plus fraîches, mais probablement plus difficiles à travailler. – mpen

+0

Si vous pouvez attendre avec la réponse jusqu'à ce que toutes les données soient collectées, continuez simplement à renvoyer les promesses, et collectez uniquement les valeurs et renvoyez un tableau lorsque vous atteignez la fin du flux. –