拦截process.stdout.write调用

问题描述 投票:0回答:2

嘿,看起来这应该很简单,但我一定错过了一些东西。我尝试使用管道和 on('data') 但似乎都没有向我传递数据。我想这样做的原因是我希望能够有一个“dev”部分并将输出流式传输到该部分,但我宁愿不必写入文件然后从文件中读取然后流式传输如果我可以拦截写入调用上的数据。

javascript logging io node.js
2个回答
0
投票

一个简单的方法就是用你的函数替换 process.stdout.write 。比如:

process.stdout.write = function() { /* Do your stuff*/ }

0
投票

这是在 Typescript 中,但我是这样做的:

const interceptAllOutput = () => {
  let stderr: string = '';
  let stdout: string = '';

  const originalStdoutWrite = process.stdout.write.bind(process.stdout);
  const originalStderrWrite = process.stderr.write.bind(process.stderr);

  process.stdout.write = (chunk: any, ...args: any[]) => {
    stdout += chunk.toString();
    return originalStdoutWrite(chunk, ...args);
  };

  process.stderr.write = (chunk: any, ...args: any[]) => {
    stderr += chunk.toString();
    return originalStderrWrite(chunk, ...args);
  };

  const stop = () => {
    process.stdout.write = originalStdoutWrite;
    process.stderr.write = originalStderrWrite;
  };

  return {
    stop,
    stderr: () => stderr,
    stdout: () => stdout,
  };
};

const { stop, stderr, stdout } = interceptAllOutput();

console.log('one');
console.error('two');
process.stdout.write('three\n');
process.stderr.write('four\n');

stop();

console.log('Collected Output:');
console.log(stdout());
console.log(stderr());

希望这对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.