You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:从process.stdin读取时console.log输出出现递增前导空格

管道输入时Node.js CLI工具console.log输出出现递增前导空格的问题

我正在开发一个接收标准输入(stdin)管道输入的CLI工具,用法示例如下:

command1 | node my-cli.js

但遇到了异常:每次调用console.log时,终端输出的内容会出现递增的前导空格。我试过用readline模块和process.stdin.on('data')两种方式处理输入,问题都存在。

相关代码示例:

process.stdin.on('data', (chunk) => {
  const line = chunk.toString();
  // console.log(line)
  console.log('hi');
});

只有当管道传入pg_prove工具的输出时才会触发这个问题,其他管道输入正常。怀疑是pg_prove的缓冲行为导致,但找不到具体原因。


问题原因

pg_prove在输出时会使用终端控制序列(比如回车符\r、光标移动指令)来实时更新测试进度(比如覆盖当前行显示最新状态),这些控制序列会被Node.js的stdin完整读取,但你的代码没有处理这些序列,导致它们干扰了后续console.log的光标定位,看起来就像是输出产生了递增的前导空格。

解决方法

方法1:过滤输入中的终端控制序列

用正则表达式移除输入里的ANSI控制码,只保留纯文本内容:

// 匹配所有ANSI终端控制序列的正则
const ansiControlRegex = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;

process.stdin.on('data', (chunk) => {
  // 清理掉所有控制序列
  const cleanContent = chunk.toString().replace(ansiControlRegex, '');
  // 后续处理或直接输出
  console.log('hi');
});

方法2:禁用pg_prove的动态输出

直接从源头避免产生控制序列,调用pg_prove时添加参数禁用彩色输出和实时进度更新:

pg_prove --nocolor --quiet your-tests.sql | node my-cli.js

方法3:用readline模块时禁用终端模拟

如果用readline处理输入,设置terminal: false来跳过终端控制序列的解析:

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: false // 禁用终端模拟,忽略控制序列
});

rl.on('line', (line) => {
  console.log('hi');
});

内容的提问来源于stack exchange,提问作者Jesse Carter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:40:22