GraphQL streaming type?

GraphQL streaming type?

本文关键字:type streaming GraphQL      更新时间:2023-09-26

我现在正在玩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期待一个完整的数组,我只能一次解决我的结果集,而不是使用发射器或其他东西。

(这不是一个真正完整的答案,但也不适合注释)

根据graphQL规范,应该可以:

GraphQL提供了许多内建的标量,但是类型的系统可以添加具有语义意义的额外标量。例如,GraphQL系统可以定义一个名为Time的标量,它被序列化为字符串,承诺符合ISO‐8601。查询类型为之后,您就可以依赖于解析结果的能力ISO - 8601解析器和使用客户端特定的原语的时间。另一个一个可能有用的自定义标量的例子是Url,它序列化作为字符串,但由服务器保证是一个有效的URL。

结构应该是这样的:

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

现在我猜你可以尝试返回承诺/流,看看会发生什么,但我认为它还不支持。很多人都在问这个问题,我想我看到了graphQL团队中有人的评论,说他们正在调查这个问题(不幸的是找不到它)。

这是我个人的意见,但是如果不将这种行为合并到graphQL的核心中就不能改变它,这可能表明graphQL现在并不是那么灵活

基本GraphQL服务器不可能流结果,因为它有一个客户端-服务器架构(您发送HTTP请求并获得HTTP响应)。

但是订阅是可能的。它们最近被添加到GraphQL中(参见后面的故事)。

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