从节点 v13 开始,您可以在其中使用生成器pipeline
并将对象构建为字符串:
// const { pipeline } = require('stream/promises'); // <- node >= 16
const Util = require('util');
const pipeline = Util.promisify(Stream.pipeline);
const algorithm = 'aes-256-ctr';
const Crypto = require('crypto');
async function run() {
await pipeline(
file.stream, // <- your file read stream
Crypto.createCipher(algorithm, encryptionKey),
chunksToJson,
outStream
);
}
async function* chunksToJson(chunksAsync) {
yield '{"content": "';
for await (const chunk of chunksAsync) {
yield Buffer.isBuffer(chunk) ? chunk.toString('utf8') : JSON.stringify(chunk);
}
yield '"}';
}
假设正在流式传输大量数据的更复杂情况(使用流时通常是这种情况),您可能会尝试执行以下操作。这不是一个好的做法,因为所有这些content
都将在屈服之前在内存中建立,从而违背了流式传输的目的。
async function* chunksToJson(chunksAsync) {
const json = { content: [] };
for await (const chunk of chunksAsync) {
json.content.push(Buffer.isBuffer(chunk) ? chunk.toString('utf8') : JSON.stringify(chunk));
}
yield JSON.stringify(json);
}