5

現在、GraphQL-JSをいじって、MariaDB バックエンドに接続しています。

結果セット全体を返す方法を見つけました:

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

これはかなりクールですが、私が使用しているライブラリでは、結果を行ごとにストリーミングすることもできます。

GraphQL にはこれを容易にするものはありますか?

私が知る限りGraphQLList、完全な配列が期待されており、エミッターなどを使用してフィードすることはできず、結果セットを一度しか解決できません。

4

3 に答える 3

1

GraphQL @stream ディレクティブの例を参照してください https://github.com/rmosolgo/graphql-ruby-stream-defer-demo

于 2016-07-27T23:59:11.487 に答える
1

基本的な GraphQL サーバーで結果をストリーミングすることはできません。これは、クライアント サーバー アーキテクチャ (HTTP 要求を送信し、HTTP 応答を取得する) を備えているためです。

ただし、サブスクリプションでは可能です。それらは最近GraphQL に追加されました (背後にあるストーリーを参照)。

于 2015-12-09T18:37:24.213 に答える
1

(これは実際には完全な答えではありませんが、コメントにも当てはまりません)

graphQL仕様によると。それは可能であるべきです:

GraphQL は多数の組み込みスカラーを提供しますが、型システムはセマンティックな意味を持つ追加のスカラーを追加できます。たとえば、GraphQL システムは、文字列としてシリアル化されている間、ISO-8601 に準拠することを約束する Time というスカラーを定義できます。Time 型のフィールドをクエリする場合、ISO-8601 パーサーを使用して結果を解析し、クライアント固有のプリミティブを時間に使用する機能に依存できます。有用な可能性のあるカスタム スカラーの別の例は Url です。これは文字列としてシリアル化されますが、有効な URL であることがサーバーによって保証されます。

したがって、構造は次のようになります。

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

プロミス/ストリームを返して何が起こるかを確認できると思いますが、まだサポートされていないと思います。多くの人がこれを求めています.graphQLチームの誰かから、これを調査しているとのコメントを見たと思います(残念ながら見つけることができません).

個人的な意見ですが、その動作をgraphQLのコアに取り込まないと変更できない場合、現在のgraphQLはそれほど柔軟ではないことを示している可能性があります。

于 2015-10-16T15:52:25.200 に答える