我正在尝试从BigQuery中读取查询并将其流式传输到前端。在带有Express的Node.js-land中,这将是:
app.get('/endpoint', (req, res) => {
bigQuery.createQueryStream(query).pipe(res);
});
但是,createQueryStream()
会不是创建一个Node.js流,它是一个返回表行的自定义流对象,因此失败了:
(node:21236)UnhandledPromiseRejectionWarning:TypeError [ERR_INVALID_ARG_TYPE]:第一个参数必须是字符串或缓冲区类型之一。收到的类型对象
bigquery.createQueryStream(query)
.on('data', function(row) {
// row is a result from your query.
})
因此,有没有一种方法可以将BigQuery数据流式传输到前端?我曾经考虑过两个潜在的解决方案,但想知道是否有人知道更好的方法:
JSON.stringify()
该行并返回JSONL
,而不是普通的JSON
。这增加了解码的前端负担,但在两侧都相当容易。request(url, { body: { query, params } }).pipe(res)
(或任何特定的API,尚未在那儿挖)。[我感到困惑的是,说它可以进行流处理的Node.js库不能与Node.js本机流一起使用,但是似乎是这种情况。
BigQuery旨在与为不同编程语言编写的各种不同的客户端库一起使用,因此,它不返回特定于nodejs的数据结构,而是返回大多数结构化编程语言都通用的更通用的结构,例如对象。回答您的问题,是的,有一种方法可以将BigQuery数据流式传输到前端,但这是一个相当个人的选择,因为它所需要的全部就是从一种数据类型转换为另一种数据类型。但是,我想说的最直接的方法是调用您已经提到的JSON.stringify()
。
我希望有帮助。