2012-05-15 2 views
4

node.js의 readline에 문제가 있습니다. 아래에 콘솔 출력이 나와 있습니다. 굵은 글씨는 내가 타이핑하고있는 부분이고, 나머지는 서버에 의해 기록되는 내용입니다.백그라운드에서 console.log가있는 readline

 
>Teslog message 
>Testinlog message 
> log message 
log message 
Tlog message 
estinglog message 
>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

이것은 다소 문제를 해결하는 것으로 보입니다 - 콘솔이 로깅 된 후 프롬프트가 적어도 다시 그려집니다.

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(); 
} 

그러나, 중단 된 메시지가 삭제되지 않습니다.

편집 :뿐만 아니라 util.log 일처럼 더 완벽한 솔루션을 만드는 다른 것들 : 추가 cli.output.write('\x1b[2K\r');


편집 2 일을했다

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; }); 
} 

# 수정 3 : 앞에 cli.pause()cli.resume()처럼 보이고 af 전화가 중복됩니다.

+0

"더 많은 해킹"을 표시 했습니까? 당신이 원했던 것과하지 못한 것을 보여줘야합니다. – jcolebrand

+0

네, 4 번 라인은 해킹이라고합니다. – Eric

+1

하지만 사람들에게 분명하게 말하십시오. – jcolebrand