7

我在使用 node.js 的 readline 时遇到问题。下面显示的是控制台输出:粗体字是我输入的内容,其余的是服务器正在记录的内容。

>测试日志消息
>测试日志消息
> 日志消息
日志消息
T日志消息
esting日志消息
> 123

简而言之,我的代码如下所示

setInterval(function() { console.log("log message") }, 1000);
var cli = require('readline').createInterface(process.stdin, process.stdout);
cli.setPrompt("> ", 2);
cli.on('line', function(line) {
    cli.prompt();
});
cli.prompt();

我怎样才能得到提示以提供新的输出空间,而不会完全破坏我正在输入的任何内容?

4

1 回答 1

9

这似乎在一定程度上解决了问题——在控制台登录后,提示至少会被重绘。

var log = console.log;
console.log = function() {
    // cli.pause();
    cli.output.write('\x1b[2K\r');
    log.apply(console, Array.prototype.slice.call(arguments));
    // cli.resume();
    cli._refreshLine();
}

但是,中断的提示不会被清除。

编辑:添加cli.output.write('\x1b[2K\r');使它工作


编辑 2:更完整的解决方案,使其他事情也util.log能正常工作:

function fixStdoutFor(cli) {
    var oldStdout = process.stdout;
    var newStdout = Object.create(oldStdout);
    newStdout.write = function() {
        cli.output.write('\x1b[2K\r');
        var result = oldStdout.write.apply(
            this,
            Array.prototype.slice.call(arguments)
        );
        cli._refreshLine();
        return result;
    }
    process.__defineGetter__('stdout', function() { return newStdout; });
}

#EDIT 3:看起来cli.pause()cli.resume()通话前后都是多余的。

于 2012-05-15T20:07:14.873 回答