Węzeł.js: drukowanie na konsoli Bez kończącego się znaku nowego wiersza?

Czy istnieje metoda drukowania na konsoli bez końcowego znaku nowego wiersza? Dokumentacja console obiektu nie mówi nic na ten temat:

console.log()

Drukuje na stdout z nowym wierszem. Funkcja ta może przyjmować wiele argumentów w sposób podobny do printf(). Przykład:

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

Jeśli elementy formatujące nie znajdują się w pierwszym łańcuchu, to util.inspect jest używane dla każdego argumentu.

Author: Evan Carroll, 2011-05-28

8 answers

Możesz użyć process.stdout.write():

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

Zobaczdokumenty po szczegóły .

 807
Author: onteria_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-30 20:15:45

Ponadto, jeśli chcesz nadpisać wiadomości w tej samej linii, na przykład w odliczaniu, możesz dodać '\r' na końcu łańcucha.

process.stdout.write("Downloading " + data.length + " bytes\r");
 316
Author: rodowi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-09 04:26:57

W konsoli Windows (również Linux), należy zastąpić '\r' równoważnym kodem \033[0G :

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

Wykorzystuje sekwencję ucieczki terminala VT220 do wysłania kursora do pierwszej kolumny.

 15
Author: Yan Te,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-15 03:12:00

Util.można również użyć print . Powinno być: http://nodejs.org/api/util.html#util_util_print

Util.print ([...])# Funkcja synchronicznego wyjścia. Zablokuje proces, rzuci każdy argument na łańcuch znaków, a następnie wyjdzie na standardowe wyjście. Nie umieszcza nowych linii po każdym argumencie.

Przykład:

// 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
Author: douyw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-15 13:02:43

Wydaje się być wiele odpowiedzi sugerujących process.stdout.write. Dzienniki błędów powinny być emitowane na process.stderr zamiast (Użyj console.error). Dla każdego, kto zastanawia się, dlaczego proces.stdout.write ('\033[0g'); nic nie robi to dlatego, że stdout jest buforowany i trzeba czekać na zdarzenie drain (Patrz Stdout flush dla NodeJS?). Jeśli write zwróci false, uruchomi Zdarzenie drain.

 7
Author: Ahmed Masud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37

Jako rozszerzenie / ulepszenie genialnego dodatku zrobionego przez @ rodowi powyżej, dotyczącego możliwości nadpisania wiersza:

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

Jeśli nie chcesz, aby kursor terminala znajdował się przy pierwszym znaku, jak widziałem w moim kodzie, rozważ wykonanie następujących czynności:

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)

Poprzez umieszczenie \r przed następną instrukcją print kursor jest resetowany tuż przed zastąpieniem poprzedniego ciągu znaków.

 4
Author: mraxus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-27 00:33:06

Żadne z tych rozwiązań nie działa dla mnie. proces.stdout.write ('ok\033[0g') and just using '\r ' just create a new line, do not overrite, Mac OSX 10.9.2

EDIT: musiałem użyć tego, aby zastąpić bieżącą linię

Proces.stdout.write ("\033[0g"); proces.stdout.write ('newstuff');

 3
Author: Tyguy7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-04 18:44:51

Wystąpił błąd podczas używania trybu ścisłego.

Błąd węzła: "literały ósemkowe nie są dozwolone w trybie ścisłym."

Znalazłem odpowiedź tutaj: https://github.com/SBoudrias/Inquirer.js/issues/111

Proces.stdout.write ("received:" + bytesReceived + "\x1b[0g");

 3
Author: blablabla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-30 08:48:47