gpt4 book ai didi

javascript - 在 Node.js 数据流中通过换行获取 block

转载 作者:搜寻专家 更新时间:2023-10-31 23:08:00 27 4
gpt4 key购买 nike

有一次我认为您可以告诉 Node.js 子进程按换行符对数据进行分块。如下所示,来自子进程的 stderr 数据事件针对字符和单词而非行触发。理想情况下,我可以传递一个标志来告诉流仅在一行数据准备就绪时触发数据事件。有没有办法做到这一点?

我有这个:

const sh = spawn('sh', [ b ], {
cwd: cwd,
});

sh.stdout.pipe(fs.createWriteStream('/dev/null'));

var stderr = '';
var line = '';

sh.stderr.setEncoding('utf8');

sh.stderr.on('data', function (d) {

//trying to split by newlines, but this is hairy logic
const lines = String(d).split('\n');

line += lines.shift();

if(lines.length > 0){

if (!String(d).match(/npm/ig) && !String(d).match(/npm/ig)) {
stderr += d;
process.stderr.write.apply(process.stderr, arguments);
}

}

});

并且在这个处理程序中返回的数据不是整行

sh.stderr.on('data', function (d) {
// d is chunks of data but not whole lines
});

有没有办法告诉 stderr 在触发“数据”事件之前等待换行符?

最佳答案

您可以使用 Transform stream为此。

实现并不是那么简单,所以我建议使用像 split2 这样的库.

基本思路:

const Transform = require('stream').Transform;
const StringDecoder = require('string_decoder').StringDecoder;

const decoder = new StringDecoder('utf8');

const myTransform = new Transform({
transform(chunk, encoding, cb) {
if ( this._last === undefined ) { this._last = "" }
this._last += decoder.write(chunk);
var list = this._last.split(/\n/);
this._last = list.pop();
for (var i = 0; i < list.length; i++) {
this.push( list[i] );
}
cb();
},

flush(cb) {
this._last += decoder.end()
if (this._last) { this.push(this._last) }
cb()
}
});

sh.stderr.pipe( myTransform )
.on('data', function (line) {
console.log("[" + line + "]");
});

关于javascript - 在 Node.js 数据流中通过换行获取 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40781713/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com