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 實現)服務器端的內存需求較低,因為并非所有數據都一次保存在內存中,只有小塊。
添加回答
舉報