smtp-protocol
SMTP 이메일을 캡처하고 메일 데이터를 처리 하는 데 사용하는 Node 프로그램을 해킹하고 있습니다. 라이브러리는 메일 데이터를 스트림으로 제공하며 문자열로 가져 오는 방법을 모르겠습니다.
나는 현재 그것을 stdout에 쓰고 stream.pipe(process.stdout, { end: false })
있지만 말했듯이 스트림 데이터가 대신 문자열로 필요하며 스트림이 끝나면 사용할 수 있습니다.
Node.js 스트림의 모든 데이터를 문자열로 수집하려면 어떻게해야합니까?
답변
(이 답변은 몇 년 전 베스트 답변이었던 것입니다. 이제이 아래에 더 나은 답변이 있습니다. node.js를 따라 가지 않았으며이 질문에 “정답”이라고 표시되어 있기 때문에이 답변을 삭제할 수 없습니다. “. 다운 클릭을 생각하고 있다면 어떻게 하시겠습니까?)
핵심은 Readable Stream 의 data
및 end
이벤트 를 사용하는 것 입니다. 다음 이벤트를 들어보십시오.
stream.on('data', (chunk) => { ... });
stream.on('end', () => { ... });
data
이벤트 를 수신하면 데이터를 수집하기 위해 생성 된 버퍼에 새 데이터 청크를 추가합니다.
end
이벤트 를 받으면 필요한 경우 완성 된 버퍼를 문자열로 변환합니다. 그런 다음 필요한 작업을 수행하십시오.
답변
또 다른 방법은 스트림을 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)
답변
위의 어느 것도 나를 위해 일하지 않았습니다. 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));
});
답변
위의 답변보다 유용하기를 바랍니다.
var string = '';
stream.on('data',function(data){
string += data.toString();
console.log('stream data ' + part);
});
stream.on('end',function(){
console.log('final output ' + string);
});
문자열 연결은 문자열 부분을 수집하는 가장 효율적인 방법은 아니지만 단순성을 위해 사용됩니다 (그리고 코드가 효율성에 관심이 없을 수도 있음).
또한이 코드는 비 ASCII 텍스트에 대해 예측할 수없는 오류를 생성 할 수 있지만 (모든 문자가 한 바이트에 맞는다고 가정 함) 아마도 그것에 대해 신경 쓰지 않을 것입니다.
답변
일반적으로이 간단한 함수를 사용하여 스트림을 문자열로 변환합니다.
function streamToString(stream, cb) {
const chunks = [];
stream.on('data', (chunk) => {
chunks.push(chunk.toString());
});
stream.on('end', () => {
cb(chunks.join(''));
});
}
사용 예 :
let stream = fs.createReadStream('./myFile.foo');
streamToString(stream, (data) => {
console.log(data); // data is now my string variable
});
답변
그리고 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()));
});
}
용법:
const stream = fs.createReadStream(__filename);
getStream(stream).then(r=>console.log(r));
.toString()
필요한 경우 바이너리 데이터와 함께 사용할을 제거하십시오 .
update : @AndreiLED가 문자열에 문제가 있음을 올바르게 지적했습니다. 내가 가지고있는 노드 버전으로 문자열을 반환하는 스트림을 얻을 수 없었지만 API 는 이것이 가능하다는 것을 알립니다 .
답변
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);
})