[javascript] Node.js 스트림의 내용을 문자열 변수로 어떻게 읽습니까?

smtp-protocolSMTP 이메일을 캡처하고 메일 데이터를 처리 하는 데 사용하는 Node 프로그램을 해킹하고 있습니다. 라이브러리는 메일 데이터를 스트림으로 제공하며 문자열로 가져 오는 방법을 모르겠습니다.

나는 현재 그것을 stdout에 쓰고 stream.pipe(process.stdout, { end: false })있지만 말했듯이 스트림 데이터가 대신 문자열로 필요하며 스트림이 끝나면 사용할 수 있습니다.

Node.js 스트림의 모든 데이터를 문자열로 수집하려면 어떻게해야합니까?



답변

(이 답변은 몇 년 전 베스트 답변이었던 것입니다. 이제이 아래에 더 나은 답변이 있습니다. node.js를 따라 가지 않았으며이 질문에 “정답”이라고 표시되어 있기 때문에이 답변을 삭제할 수 없습니다. “. 다운 클릭을 생각하고 있다면 어떻게 하시겠습니까?)

핵심은 Readable Streamdataend이벤트 를 사용하는 것 입니다. 다음 이벤트를 들어보십시오.

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);
})