【问题标题】:GraphQL streaming type?GraphQL 流式传输类型?
【发布时间】:2015-11-16 14:36:55
【问题描述】:

我现在正在使用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);
                });
            }),
        }
    })
});

这很酷,但 library I'm using 也让我 stream results 逐行。

GraphQL 有什么可以促进这一点吗?

据我所知,GraphQLList 期待一个完整的数组,我只能解析我的结果集一次,不能使用 Emitter 或其他东西进行馈送。

【问题讨论】:

    标签: javascript streaming graphql graphql-js


    【解决方案1】:

    (这不是一个完整的答案,但也不适合评论)

    根据 graphQL 规范。应该可以的:

    GraphQL 提供了许多内置的标量,但 类型系统可以 添加具有语义含义的附加标量。例如,一个 GraphQL 系统可以定义一个称为 Time 的标量,它虽然被序列化为 字符串,承诺符合 ISO-8601。查询类型字段时 时间,然后您可以依靠解析结果的能力 ISO-8601 解析器并使用特定于客户端的原语来表示时间。其他 一个可能有用的自定义标量的例子是 Url,它序列化 作为一个字符串,但服务器保证它是一个有效的 URL。

    所以结构应该是这样的:

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

    现在我猜你可以尝试返回 promises/streams 看看会发生什么,但我认为它还不被支持。很多人都在问这个问题,我想我看到了来自 graphQL 团队的某个人的评论,说他们正在调查这个问题(很遗憾找不到它)。

    个人意见,但如果不将这种行为纳入 graphQL 的核心就无法更改,则可能表明现在的 graphQL 不够灵活。

    【讨论】:

      【解决方案2】:

      无法使用基本 GraphQL 服务器流式传输结果,因为它具有客户端-服务器架构(您发送 HTTP 请求并返回 HTTP 响应)。

      不过,订阅是可能的。他们是 GraphQL 的 recently added(请参阅 the story behind)。

      【讨论】:

      • 我想当我写这篇文章时,我希望resolve 允许生成器返回类型或其他一些流。在生成器/流耗尽/关闭之前,不会发送 HTTP 响应。我会查看您发布的这些链接。流式响应会更酷,但可能更难处理。
      【解决方案3】:

      请参阅 GraphQL @stream 指令,例如 https://github.com/rmosolgo/graphql-ruby-stream-defer-demo

      【讨论】:

        猜你喜欢
        • 2021-01-10
        • 2014-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-17
        • 2020-07-17
        • 2019-03-15
        相关资源
        最近更新 更多