7

node.jsのreadlineに問題があります。以下に示すのはコンソール出力です。太字のものは私が入力しているものであり、残りはサーバーによってログに記録されているものです。

>テスログメッセージ
>テストインログメッセージ
>ログメッセージ
ログメッセージ
Tログメッセージ
エストログメッセージ
> 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');と機能しました


EDIT 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 に答える