簡體   English   中英

在 NodeJS 中使用流

[英]Using streams in NodeJS

我正在嘗試在 Nodejs 中構建一個 API,它將流式傳輸針對 vertica DB 執行的查詢的輸出。

Nodejs 中的 vertica db 驅動程序公開了我正在使用的無緩沖查詢接口。 有關更多詳細信息,請參閱: https : //github.com/wvanbergen/node-vertica

以下是我的代碼:

var vertica = require('vertica');
var Readable = require('stream').Readable;
var rs = new Readable;

var conn = vertica.connect( {
    host: 'hostname',
    user: 'user',
    password: 'password',
    database: 'verticadb'    
});


var q = conn.query('select * from table');

q.on('row', function(row) {
    rs.push(row.join(',') + "\n");
});

q.on('end', function(status) {
    rs.push(null);
    rs.pipe(process.stdout);
    conn.disconnect();
});

q.on('error', function(err) {
    conn.disconnect();
});

它確實返回了適當的輸出,但我的理解是它實際上緩沖了row.join(',') + "\\n"的輸出,並且只有在讀取所有行后才將其輸出到 stdout。 我的目標是在讀取每一行后立即將其輸出。 我應該如何修改我的代碼以使其工作? 您可以將 vertica“row” 事件替換為任何可比較的事件。

附錄

我已經根據在以下位置找到的文檔設法使用所謂的“經典可讀流”使其工作: https : //github.com/substack/stream-handbook

代碼:

var vertica = require('vertica');
var Stream = require('stream');
var stream = new Stream;
stream.readable = true;

var conn = vertica.connect( {
    host: 'hostname',
    user: 'user',
    password: 'password',
    database: 'verticadb'
});


var q = conn.query('select * from affiliate_manager_2');

q.on('row', function(row) {
    stream.emit('data', row.join(',') + "\n");
});

q.on('end', function(status) {
    stream.emit('end'); 
    conn.disconnect();
});

q.on('error', function(err) {
    conn.disconnect();
});

stream.pipe(process.stdout);

然而,這是做這件事的“舊”方式,我想知道如何使用“新方式”來做。

Readable是“抽象的”。 它正在尋找一個名為_read的函數,該函數未在默認實現中定義。 沒有它,它只會緩沖每個push(chunk)直到它看到push(null) 這就是您在示例中看到的行為。

要獲得您想要的行為,只需添加一個_read函數!

這是一個可以適應您的數據庫的示例:

var Readable = require('stream').Readable;

var stream = new Readable;

stream._read = function () {
  var query = …;
  query.on('row', function (row) {
    stream.push(JSON.stringify(row) + '\n');
  });
  query.on('end', function () {
    stream.push(null);
  });
  stream._read = function () {};
};

stream.pipe(process.stdout);

進一步閱讀:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM