2 回答
TA贡献1155条经验 获得超0个赞
BigQuery 旨在与为不同编程语言编写的各种不同客户端库一起使用,因此,它不返回特定于 nodejs 的数据结构,而是返回大多数结构化编程语言通用的更通用的结构,例如作为对象。回答您的问题,是的,有一种方法可以将 BigQuery 数据流式传输到前端,但这是一个相当个人的选择,因为它所需要的只是从一种数据类型转换为另一种数据类型。但是,我想说最直接的方法是调用JSON.stringify()
,您已经提到过。
TA贡献1826条经验 获得超6个赞
我们最终制作了一个实现,将 BigQuery 的回复拼接到一个大的 JSON 数组中:
exports.stream = (query, params, res) => {
// Light testing for descriptive errors in the parameters
for (let key in params) {
if (typeof params[key] === "number" && isNaN(params[key])) {
throw new TypeError(`The parameter "${key}" should be a number`);
}
}
return new Promise((resolve, reject) => {
let prev = false;
const onData = row => {
try {
// Only handle it when there's a row
if (!row) return;
// There was a previous row written before, so add a comma
if (prev) {
res.write(",");
}
res.write(stringify(row));
prev = true;
} catch (error) {
console.error("Cannot parse row:", error);
// Just ignore it, don't write this frame
}
};
const onEnd = () => {
res.write("]");
res.end();
resolve();
};
res.writeHead(200, { "Content-Type": "application/json" });
res.write("[");
bigQuery
.createQueryStream({ query, params })
.on("error", reject)
.on("data", onData)
.on("end", onEnd);
});
};
它将通过拼接来构建一个大型 JSON 数组:
[ // <- First character sent
stringify(row1) // <- First row
, // <- add comma on second row iteration
stringify(row2) // <- Second row
...
stringify(rowN) // <- Last row
] // <- Send the "]" character to close the array
这有以下优点:
数据在可用时立即发送,因此带宽需求较低。
(取决于 BigQuery 实现)服务器端的内存需求较低,因为并非所有数据都一次保存在内存中,只有小块。
添加回答
举报