obr*_*nmd 79 javascript stream node.js
我正在攻击node.js程序,该程序捕获SMTP邮件并对邮件数据进行操作.'smtp-protocol'节点库以流形式提供邮件数据,作为node.js新手,我不知道如何将该流写入字符串变量.我目前使用该行写入stdout:
__PRE__
正如我所说,我需要将此流数据写入字符串变量,然后在流结束后我将使用它.
非常感谢!
Tom*_*rae 61
希望这比上面的答案(现在有一个断开的链接)更有用.
另请注意,字符串连接不是收集字符串部分的有效方法,但它用于简单(也许您的代码不关心效率)
var string = '';
stream.on('data',function(data){
string += data.toString();
console.log('stream data ' + part);
});
stream.on('end',function(){
console.log('final output ' + string);
});
Run Code Online (Sandbox Code Playgroud)
Ric*_*cky 56
以上都不适合我.我需要使用Buffer对象:
const chunks = [];
readStream.on("data", function (chunk) {
chunks.push(chunk);
});
// Send the buffer or you can put it into a var
readStream.on("end", function () {
res.send(Buffer.concat(chunks));
});
Run Code Online (Sandbox Code Playgroud)
Mar*_*des 51
另一种方法是将流转换为promise(请参阅下面的示例)并使用then
(或await
)将已解析的值分配给变量.
function streamToString (stream) {
const chunks = []
return new Promise((resolve, reject) => {
stream.on('data', chunk => chunks.push(chunk))
stream.on('error', reject)
stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')))
})
}
const result = await streamToString(stream)
Run Code Online (Sandbox Code Playgroud)
Tra*_*nov 37
你怎么看待这件事 ?
// lets have a ReadableStream as a stream variable
const chunks = [];
for await (let chunk of stream) {
chunks.push(chunk)
}
const buffer = Buffer.concat(chunks);
const str = buffer.toString("utf-8")
Run Code Online (Sandbox Code Playgroud)
dre*_*lse 19
我通常使用这个简单的函数将流转换为字符串:
function streamToString(stream, cb) {
const chunks = [];
stream.on('data', (chunk) => {
chunks.push(chunk.toString());
});
stream.on('end', () => {
cb(chunks.join(''));
});
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
let stream = fs.createReadStream('./myFile.foo');
streamToString(stream, (data) => {
console.log(data); // data is now my string variable
});
Run Code Online (Sandbox Code Playgroud)
est*_*ani 14
还有另一个使用 Promise 的字符串:
function getStream(stream) {
return new Promise(resolve => {
const chunks = [];
# Buffer.from is required if chunk is a String, see comments
stream.on("data", chunk => chunks.push(Buffer.from(chunk)));
stream.on("end", () => resolve(Buffer.concat(chunks).toString()));
});
}
Run Code Online (Sandbox Code Playgroud)
用法:
const stream = fs.createReadStream(__filename);
getStream(stream).then(r=>console.log(r));
Run Code Online (Sandbox Code Playgroud)
.toString()
如果需要,删除与二进制数据一起使用的 。
更新:@AndreiLED 正确指出这有字符串问题。我无法获得返回带有我拥有的节点版本的字符串的流,但api指出这是可能的。
Eri*_*zen 11
使用 Node.js 内置的StreamConsumers.text最简单:
import { text } from 'node:stream/consumers';
import { Readable } from 'node:stream';
const readable = Readable.from('Hello world from consumers!');
const string = await text(readable);
Run Code Online (Sandbox Code Playgroud)
从nodejs 文档中你应该这样做 - 永远记住一个字符串,而不知道编码只是一堆字节:
var readable = getReadableStreamSomehow();
readable.setEncoding('utf8');
readable.on('data', function(chunk) {
assert.equal(typeof chunk, 'string');
console.log('got %d characters of string data', chunk.length);
})
Run Code Online (Sandbox Code Playgroud)
Streams没有一个简单的.toString()
函数(我理解)也没有.toStringAsync(cb)
函数(我不理解).
所以我创建了自己的辅助函数:
var streamToString = function(stream, callback) {
var str = '';
stream.on('data', function(chunk) {
str += chunk;
});
stream.on('end', function() {
callback(str);
});
}
// how to use:
streamToString(myStream, function(myStr) {
console.log(myStr);
});
Run Code Online (Sandbox Code Playgroud)
我这样使用比较幸运:
let string = '';
readstream
.on('data', (buf) => string += buf.toString())
.on('end', () => console.log(string));
Run Code Online (Sandbox Code Playgroud)
我使用节点v9.11.1
,这readstream
是回调的响应http.get
。
使用流行的(每周下载量超过 500 万次)和轻量级的get-stream库的简单方法:
https://www.npmjs.com/package/get-stream
const fs = require('fs');
const getStream = require('get-stream');
(async () => {
const stream = fs.createReadStream('unicorn.txt');
console.log(await getStream(stream)); //output is string
})();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
91133 次 |
最近记录: |