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 服务器流式传输结果,因为它具有客户端-服务器架构(您发送 HTTP 请求并返回 HTTP 响应)。

不过,订阅是可能的。它们最近被添加到 GraphQL(参见背后的故事)。

于 2015-12-09T18:37:24.213 回答
1

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

于 2016-07-27T23:59:11.487 回答
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 并不那么灵活。

于 2015-10-16T15:52:25.200 回答