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', () => { ... });
<고객명>이 data
event를 합니다.
<고객명>이 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
'programing' 카테고리의 다른 글
Tymeleaf: 조건을 사용하여 CSS 클래스를 동적으로 추가/삭제하는 방법 (0) | 2022.09.21 |
---|---|
JavaScript를 사용하여 요소까지 스크롤하려면 어떻게 해야 합니까? (0) | 2022.09.21 |
명령줄에서 외부 키 검사 비활성화 (0) | 2022.09.21 |
Python에서 오브젝트의 크기를 확인하는 방법은 무엇입니까? (0) | 2022.09.21 |
flake8이 필터 절의 부울 비교 "=="에 대해 불만을 제기합니다. (0) | 2022.09.21 |