web-dev-qa-db-ja.com

Node.js:末尾の改行なしでコンソールに印刷する

末尾の改行なしでコンソールに出力する方法はありますか? consoleオブジェクト ドキュメント はそれに関して何も言いません:

console.log()

改行付きで標準出力に出力します。この関数はprintf()のように複数の引数を取ることができます。例:

console.log('count: %d', count);

最初の文字列にフォーマット要素が見つからない場合は、各引数にutil.inspectが使用されます。

575
Evan Carroll

process.stdout.write()を使うことができます:

process.stdout.write("hello: ");

詳細については docsを参照してください

897
onteria_

また、カウントダウンなど、同じ行のメッセージを上書きしたい場合は、文字列の最後に '\ r'を追加することもできます。

process.stdout.write("Downloading " + data.length + " bytes\r");
338
defvol

Windowsコンソール(Linuxも)では、 '\ r'をそれと等価なコードに置き換えてください \033 [0G

process.stdout.write('ok\033[0G');

これはVT220端末エスケープシーケンスを使用してカーソルを最初の列に送ります。

15
Yan Te

util.print も使用できます。読んでください: http://nodejs.org/api/util.html#util_util_print

util.print([...])#同期出力関数です。プロセスをブロックし、各引数を文字列にキャストしてから標準出力に出力します。各引数の後に改行を入れません。

例:

// get total length
var len = parseInt(response.headers['content-length'], 10);
var cur = 0;

// handle the response
response.on('data', function(chunk) {
  cur += chunk.length;
  util.print("Downloading " + (100.0 * cur / len).toFixed(2) + "% " + cur + " bytes\r");
});
13
douyw

行を上書きできることに関して上記の@rodowiによってなされた素晴らしい追加への拡張/強化として:

process.stdout.write("Downloading " + data.length + " bytes\r");

私のコードで見たように、端末カーソルを最初の文字に配置したくない場合は、次のことを検討してください。

let dots = ''
process.stdout.write(`Loading `)

let tmrID = setInterval(() => {
  dots += '.'
  process.stdout.write(`\rLoading ${dots}`)
}, 1000)

setTimeout(() => {
  clearInterval(tmrID)
  console.log(`\rLoaded in [3500 ms]`)
}, 3500)

次のprintステートメントの前に\rを置くことによって、置換ストリングが前のストリングを上書きする直前にカーソルがリセットされます。

12
mraxus

process.stdout.writeを示唆する答えはたくさんあるようです。代わりにエラーログをprocess.stderrに発行する必要があります(console.errorを使用してください)。なぜprocess.stdout.write( '\ 033 [0G');何もしていなかったのは、stdoutがバッファされていて、drainイベントを待つ必要があるからです( StdoutがNodeJSをフラッシュしますか? を参照)。 writeがfalseを返すと、drainイベントが発生します。

9
Ahmed Masud

厳密モードを使用するとエラーが発生しました。

ノードエラー: "8進数リテラルは厳密モードでは使用できません。"

私はここで答えを見つけました: https://github.com/SBoudrias/Inquirer.js/issues/111

process.stdout.write( "受信:" + bytesReceived + "\ x1B [0G");

4
blablabla

これらの解決策のどれも私のために働きません。 process.stdout.write( 'ok\033 [0G')と '\ r'を使用して新しい行を作成するだけで、上書きしないでください。

編集:私は現在の行を置き換えるためにこれを使用しなければならなかった

process.stdout.write( '\ 033 [0G'); process.stdout.write( 'newstuff');

3
Tyguy7