Разница между «process.stdout.write» и «console.log» в node.js?

323

В чем разница между "process.stdout.write" и "console.log" в node.js?

РЕДАКТИРОВАТЬ: Использование console.log для переменной показало много нечитаемых символов при использовании process.stdout.write показало объект.

Это почему?

ajsie
источник
4
Можете ли вы привести пример? console.log () вызывает process.stdout.write с форматированным выводом. См. Format () в console.js для реализации.
TK-421

Ответы:

324

console.log()звонки process.stdout.writeс форматированным выводом. Смотрите format()в console.js для реализации.

В настоящее время (v0.10.ish):

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};
ТК-421
источник
34
Также стоит упомянуть, что, console.log()кажется, добавить новую
строку
144

Если посмотреть на документы Node, то console.log - это просто process.stdout.write с переводом строки в конце:

console.log = function (d) {
  process.stdout.write(d + '\n');
};

Источник: http://nodejs.org/docs/v0.3.1/api/process.html#process.stdout

Мовис Ледфорд
источник
18
Для людей, приходящих позже, обратите внимание, что v0.3.1 был давно, и с тех пор все изменилось. :)
Брендан
5
...Нет. Только что взглянул на документацию v0.9.9, а console.log все еще является псевдонимом для process.stdout.write с переводом строки. Пожалуйста, сделайте свое исследование, прежде чем комментировать. nodejs.org/docs/v0.9.9/api/process.html#process.stdout
Маувис Ледфорд
13
1) v0.9.9 два года 2) что документация неверна, согласно v0.9.9 формат интерполируется через util
Brendan
4
На самом деле, кажется, что эта документация никогда не обновлялась и все еще существует (СУХОЙ кто-нибудь?). Я отправлю пиар, чтобы исправить это, спасибо, что сообщили мне об этой проблеме :)
Брендан,
Кроме того, nodejs.org/docs/latest/api/… и nodejs.org/docs/latest/api/… .
Чарльз Вуд
66

Я знаю , что это очень старый вопрос , но я не видел , кто говорил о главном различии между process.stdout.writeи console.logи я просто хочу упомянуть об этом.

Как указали Маувис Лефорд и TK-421 , console.logоператор добавляет line-breakсимвол в конце строки ( \n), но это еще не все, что он делает.

Код не изменился по крайней мере с 0.10.Xверсии, и теперь у нас есть 5.Xверсия.

Вот код:

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};

Как видите, есть часть, которая говорит .apply(this, arguments)и имеет большое значение для функциональности. Это легче объяснить с помощью примеров:

process.stdout.write имеет очень базовую функциональность, вы можете просто написать что-то там, например:

process.stdout.write("Hello World\n"); 

Если вы не поставите строку разрыва в конце, вы получите странный символ после вашей строки, что-то вроде этого:

process.stdout.write("Hello World"); //Hello World% 

(Я думаю, что это означает что-то вроде «конец программы», поэтому вы увидите это только в том случае, если вы process.stdout.writeиспользовали конец файла и не добавили строку разрыва)

С другой стороны, console.logможно сделать больше.

  1. Вы можете использовать его таким же образом

    console.log("Hello World"); //You don't need the break line here because it was already formated а также этот странный персонаж действительно исчез

  2. Вы можете написать более одной строки

    console.log("Hello", "World");

  3. Вы можете сделать ассоциации

    console.log("Hello %s", "World") //Useful when "World" is inside a variable

И это все, что дополнительная функциональность предоставляется благодаря этой util.format.applyчасти (я мог бы много рассказать о том, что именно это делает, но вы поняли мою точку зрения, вы можете прочитать больше здесь ).

Я надеюсь, что кто-то найдет эту информацию полезной.

Gepser
источник
Было бы очень полезно также, если бы вы объяснили, как использовать stdout.writeи как избежать%
Мухаммад Ареф
Я решил проблему получения %в конце, просто позвонив process.stdout.write('\n');в конце моего цикла (если у вас есть, например)
Мухаммед Ареф
2
Это %просто способ оболочки сказать, что в конце файла нет новой строки.
Дейв Ньютон
1
@DaveNewton ваша точка зрения важна, потому что это означает, что если вы, например, перенаправляете вывод своей программы в файл, вы не получите его %в файле
mr.mams
31

Одно большое отличие, которое не было упомянуто, состоит в том, что process.stdout принимает только строки в качестве аргументов (также могут быть потоками по конвейеру), а console.log принимает любой тип данных Javascript.

например:

// ok
console.log(null)
console.log(undefined)
console.log('hi')
console.log(1)
console.log([1])
console.log({one:1})
console.log(true)
console.log(Symbol('mysymbol'))

// any other data type passed as param will throw a TypeError
process.stdout.write('1')

// can also pipe a readable stream (assuming `file.txt` exists)
const fs = require('fs')
fs.createReadStream('file.txt').pipe(process.stdout)
thelostspore
источник
15

Еще одно важное отличие в этом контексте было бы с process.stdout.clearLine()и process.stdout.cursorTo(0).

Это было бы полезно, если вы хотите показать процент загрузки или обработки в одной строке. Если вы используете clearLine (), cursorTo () с console.log()ним не работает, потому что он также добавляет \ n к тексту. Просто попробуйте этот пример:

var waitInterval = 500;
var totalTime = 5000;
var currentInterval = 0;

function showPercentage(percentage){
    process.stdout.clearLine();
    process.stdout.cursorTo(0);
    console.log(`Processing ${percentage}%...` ); //replace this line with process.stdout.write(`Processing ${percentage}%...`);
}

var interval = setInterval(function(){
 currentInterval += waitInterval;
 showPercentage((currentInterval/totalTime) * 100);
}, waitInterval);

setTimeout(function(){
 clearInterval(interval); 
}, totalTime);
saikirann
источник
Это то, что я ищу. Спасибо.
Патрик П.
5

Я только что заметил что-то во время исследования этого после получения помощи с https.request для метода post. Думаю, я поделюсь с вами информацией, чтобы понять

process.stdout.writeне добавляет новую строку, в то время как console.logделает, как уже упоминали другие. Но есть и то, что легче объяснить на примерах.

var req = https.request(options, (res) => {
    res.on('data', (d) => {
        process.stdout.write(d);
        console.log(d)
    });
});

process.stdout.write(d);правильно распечатает данные без новой строки. Тем console.log(d)не менее, будет напечатана новая строка, но данные не будут отображаться правильно, <Buffer 12 34 56...например, для этого .

Чтобы console.log(d)правильно показать информацию, мне нужно это сделать.

var req = https.request(options, (res) => {
    var dataQueue = "";    
    res.on("data", function (d) {
        dataQueue += d;
    });
    res.on("end", function () {
        console.log(dataQueue);
    });
});

Итак, в основном:

  • process.stdout.write непрерывно печатает информацию как извлекаемые данные и не добавляет новую строку.

  • console.log печатает информацию о том, что было получено в точке поиска и добавляет новую строку.

Это лучший способ объяснить это.

Новая звезда
источник
1

Простая разница в том, что методы console.log () автоматически добавляют символ новой строки. Это означает, что если мы перебираем и печатаем результат, каждый результат печатается в новой строке.

Методы process.stdout.write () не добавляют символ новой строки. полезно для печати шаблонов.

Ришу Ананд
источник
0

Console.log реализует process.sdout.write, process.sdout.write - это буфер / поток, который будет напрямую выводиться на вашу консоль.

В соответствии с моей puglin serverline : console = new Console(consoleOptions)вы можете переписать класс консоли с вашей собственной системой readline .

Вы можете увидеть исходный код console.log:


Узнать больше :

  • readline.createInterface, чтобы настроить ваше поведение или использовать консольный ввод.
A-312
источник