[英]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.