求助:从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
相关产品推荐
相关产品推荐

