亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Express 將 BigQuery 流式傳輸到前端

使用 Express 將 BigQuery 流式傳輸到前端

桃花長相依 2021-12-02 19:37:52
我正在嘗試從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。這增加了解碼它的前端負擔,但使雙方都相當容易。轉到REST API并使用以下請求進行實際流式傳輸:(request(url, { body: { query, params } }).pipe(res)或任何特定的 API,尚未在那里挖掘)。我很困惑,一個 Node.js 庫說它可以進行流式處理,但它不適用于 Node.js 本機流,但情況似乎確實如此。
查看完整描述

2 回答

?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

BigQuery 旨在與為不同編程語言編寫的各種不同客戶端庫一起使用,因此,它不返回特定于 nodejs 的數據結構,而是返回大多數結構化編程語言通用的更通用的結構,例如作為對象?;卮鹉膯栴},是的,有一種方法可以將 BigQuery 數據流式傳輸到前端,但這是一個相當個人的選擇,因為它所需要的只是從一種數據類型轉換為另一種數據類型。但是,我想說最直接的方法是調用JSON.stringify(),您已經提到過。



查看完整回答
反對 回復 2021-12-02
?
躍然一笑

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


查看完整回答
反對 回復 2021-12-02
  • 2 回答
  • 0 關注
  • 266 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號