programing

Node.js 스트림의 내용을 문자열 변수로 읽으려면 어떻게 해야 합니까?

itsource 2022. 9. 21. 22:13
반응형

Node.js 스트림의 내용을 문자열 변수로 읽으려면 어떻게 해야 합니까?

SMTP 이메일을 캡처하고 메일 데이터를 처리하는 노드 프로그램을 해킹하고 있습니다.라이브러리는 메일 데이터를 스트림으로 제공하는데, 어떻게 그것을 문자열에 넣어야 할지 모르겠어요.

요.stream.pipe(process.stdout, { end: false })말씀드렸듯이 스트링 내의 스트림 데이터가 필요합니다.이치노

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

예 ) 사용하다then (오류)await를 사용하여 를 사용하여 변수에 해결된 값을 할당합니다.

function streamToString (stream) {
  const chunks = [];
  return new Promise((resolve, reject) => {
    stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
    stream.on('error', (err) => reject(err));
    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));
  });

이것에 대해 어떻게 생각하세요?

async function streamToString(stream) {
    // lets have a ReadableStream as a stream variable
    const chunks = [];

    for await (const chunk of stream) {
        chunks.push(Buffer.from(chunk));
    }

    return Buffer.concat(chunks).toString("utf-8");
}

이 답변이 위의 답변보다 더 유용하기를 바랍니다.

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 이외의 텍스트에 예측할 수 없는 에러가 발생하는 일이 있습니다(모든 문자가 1바이트에 들어가는 것을 전제로 하고 있습니다).그러나, 이 코드에 대해서도 신경쓰지 않는 경우가 있습니다.

(이 답변은 수년 전에 나온 것입니다.그때문입니다.이제 이 아래에 더 나은 답이 있다.node.js에 대응하고 있지 않습니다.또, 이 회답은 「이 질문의 정답」이라고 표시되어 있기 때문에 삭제할 수 없습니다.다운클릭을 생각하고 있는 경우는 어떻게 하면 좋을까요?)

중요한 것은 가독성 스트림의 및 이벤트를 사용하는 것입니다.다음 이벤트를 듣습니다.

stream.on('data', (chunk) => { ... });
stream.on('end', () => { ... });

<고객명>이 dataevent를 합니다.

<고객명>이 end필요한 경우 완료된 버퍼를 문자열로 변환합니다.그럼 네가 할 일을 해.

스트림을 문자열로 변환하기 위해 보통 다음과 같은 간단한 함수를 사용합니다.

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

그리고 또 다른 것은 약속을 이용한 현악기입니다.

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

인기 있는 (주간 다운로드 수 500만 건 이상)및 경량 Get-Stream Library를 통한 간단한 방법:

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

스트림은 단순하지 않습니다..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);
});

그런 식으로 사용하는 것이 더 행운이었습니다.

let string = '';
readstream
    .on('data', (buf) => string += buf.toString())
    .on('end', () => console.log(string));

노드 사용v9.11.1및 그readstream의 응답입니다.http.get콜백

가장 깨끗한 해결책은 스트림을 약속 문자열로 변환하는 "string-stream" 패키지를 사용하는 것입니다.

const streamString = require('stream-string')

streamString(myStream).then(string_variable => {
    // myStream was converted to a string, and that string is stored in string_variable
    console.log(string_variable)

}).catch(err => {
     // myStream emitted an error event (err), so the promise from stream-string was rejected
    throw err
})

감류기 같은 건 어때?

ES6 클래스의 사용 예를 다음에 나타냅니다.

var stream = require('stream')

class StreamReducer extends stream.Writable {
  constructor(chunkReducer, initialvalue, cb) {
    super();
    this.reducer = chunkReducer;
    this.accumulator = initialvalue;
    this.cb = cb;
  }
  _write(chunk, enc, next) {
    this.accumulator = this.reducer(this.accumulator, chunk);
    next();
  }
  end() {
    this.cb(null, this.accumulator)
  }
}

// just a test stream
class EmitterStream extends stream.Readable {
  constructor(chunks) {
    super();
    this.chunks = chunks;
  }
  _read() {
    this.chunks.forEach(function (chunk) { 
        this.push(chunk);
    }.bind(this));
    this.push(null);
  }
}

// just transform the strings into buffer as we would get from fs stream or http request stream
(new EmitterStream(
  ["hello ", "world !"]
  .map(function(str) {
     return Buffer.from(str, 'utf8');
  })
)).pipe(new StreamReducer(
  function (acc, v) {
    acc.push(v);
    return acc;
  },
  [],
  function(err, chunks) {
    console.log(Buffer.concat(chunks).toString('utf8'));
  })
);

나열된 모든 응답은 읽기 가능 스트림을 흐름 모드로 여는 것으로 보입니다.이것은 NodeJ의 기본값이 아니며 NodeJ가 일시정지된 읽기 가능 스트림모드에서 제공하는 배압 지원이 부족하기 때문에 제한이 있을 수 있습니다.다음은 버퍼, 네이티브 스트림 및 네이티브 스트림 변환과 객체 모드 지원을 사용한 구현입니다.

import {Transform} from 'stream';

let buffer =null;    

function objectifyStream() {
    return new Transform({
        objectMode: true,
        transform: function(chunk, encoding, next) {

            if (!buffer) {
                buffer = Buffer.from([...chunk]);
            } else {
                buffer = Buffer.from([...buffer, ...chunk]);
            }
            next(null, buffer);
        }
    });
}

process.stdin.pipe(objectifyStream()).process.stdout

이것은 나에게 효과가 있었고, Node v6.7.0 문서에 근거하고 있습니다.

let output = '';
stream.on('readable', function() {
    let read = stream.read();
    if (read !== null) {
        // New stream data is available
        output += read.toString();
    } else {
        // Stream is now finished when read is null.
        // You can callback here e.g.:
        callback(null, output);
    }
});

stream.on('error', function(err) {
  callback(err, null);
})

set Encoding('utf8');

위의 세바스찬 J는 잘했다.

가지고 있던 테스트 코드 몇 줄에 버퍼 문제가 있어 인코딩 정보를 추가하면 해결되었습니다.

문제를 설명하다

소프트웨어

// process.stdin.setEncoding('utf8');
process.stdin.on('data', (data) => {
    console.log(typeof(data), data);
});

입력

hello world

산출량

object <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64 0d 0a>

솔루션 데모

소프트웨어

process.stdin.setEncoding('utf8'); // <- Activate!
process.stdin.on('data', (data) => {
    console.log(typeof(data), data);
});

입력

hello world

산출량

string hello world

프로젝트 의존관계에 이미 포함되어 있을 가능성이 높은 매우 인기 있는 패키지를 사용하면 다음과 같이 간단합니다.

// imports
const { WritableStreamBuffer } = require('stream-buffers');
const { promisify } = require('util');
const { createReadStream } = require('fs');
const pipeline = promisify(require('stream').pipeline);

// sample stream
let stream = createReadStream('/etc/hosts');

// pipeline the stream into a buffer, and print the contents when done
let buf = new WritableStreamBuffer();
pipeline(stream, buf).then(() => console.log(buf.getContents().toString()));

이 경우 콘텐츠 유형 응답 헤더는 Content-Type: text/plain이었습니다.Buffer에서 다음과 같은 데이터를 읽었습니다.

let data = [];
stream.on('data', (chunk) => {
 console.log(Buffer.from(chunk).toString())
 data.push(Buffer.from(chunk).toString())
});

언급URL : https://stackoverflow.com/questions/10623798/how-do-i-read-the-contents-of-a-node-js-stream-into-a-string-variable

반응형