第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

使用 Express 將 BigQuery 流式傳輸?shù)角岸?/h1>

我正在嘗試從BigQuery讀取查詢并將其流式傳輸?shù)角岸?。在帶?Express 的 Node.js-land 中,這將是:app.get('/endpoint', (req, res) => {  bigQuery.createQueryStream(query).pipe(res);});但是,createQueryStream()它不會創(chuàng)建 Node.js 流,而是一個(gè)返回表行的自定義流對象,因此它失敗了:(node:21236) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: 第一個(gè)參數(shù)必須是字符串或緩沖區(qū)類型之一。接收類型對象這在官方文檔中得到證實(shí):bigquery.createQueryStream(query)  .on('data', function(row) {    // row is a result from your query.  })那么,有沒有辦法將 BigQuery 數(shù)據(jù)流式傳輸?shù)角岸耍课蚁脒^兩種可能的解決方案,但想知道是否有人知道更好的方法:JSON.stringify()行并返回JSONL而不是普通JSON。這增加了解碼它的前端負(fù)擔(dān),但使雙方都相當(dāng)容易。轉(zhuǎn)到REST API并使用以下請求進(jìn)行實(shí)際流式傳輸:(request(url, { body: { query, params } }).pipe(res)或任何特定的 API,尚未在那里挖掘)。我很困惑,一個(gè) Node.js 庫說它可以進(jìn)行流式處理,但它不適用于 Node.js 本機(jī)流,但情況似乎確實(shí)如此。
查看完整描述

2 回答

?
白衣非少年

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊

BigQuery 旨在與為不同編程語言編寫的各種不同客戶端庫一起使用,因此,它不返回特定于 nodejs 的數(shù)據(jù)結(jié)構(gòu),而是返回大多數(shù)結(jié)構(gòu)化編程語言通用的更通用的結(jié)構(gòu),例如作為對象?;卮鹉膯栴},是的,有一種方法可以將 BigQuery 數(shù)據(jù)流式傳輸?shù)角岸?,但這是一個(gè)相當(dāng)個(gè)人的選擇,因?yàn)樗枰闹皇菑囊环N數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型。但是,我想說最直接的方法是調(diào)用JSON.stringify(),您已經(jīng)提到過。



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

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊

我們最終制作了一個(gè)實(shí)現(xiàn),將 BigQuery 的回復(fù)拼接到一個(gè)大的 JSON 數(shù)組中:


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);

  });

};

它將通過拼接來構(gòu)建一個(gè)大型 JSON 數(shù)組:


[   // <- 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

這有以下優(yōu)點(diǎn):


數(shù)據(jù)在可用時(shí)立即發(fā)送,因此帶寬需求較低。

(取決于 BigQuery 實(shí)現(xiàn))服務(wù)器端的內(nèi)存需求較低,因?yàn)椴⒎撬袛?shù)據(jù)都一次保存在內(nèi)存中,只有小塊。


查看完整回答
反對 回復(fù) 2021-12-02
  • 2 回答
  • 0 關(guān)注
  • 260 瀏覽
慕課專欄
更多

添加回答

了解更多

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號