0

我有一个可读的流,像这样:

const algorithm = 'aes-256-ctr';
stream = file.stream
    .pipe(crypto.createCipher(algorithm, encryptionKey))
    .pipe(outStream);

加密在整个文件上按预期工作。我需要将加密的结果包装成某种 json,所以输出流接收这样的东西:

{
    "content": "/* MY STREAM CONTENT */"
}

我怎么做?

此外,如果加密密钥匹配,我需要读取存储在磁盘上的文件并将其从 json 中解包。

提前致谢

4

1 回答 1

1

从节点 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);
}
于 2021-07-30T23:10:28.710 回答