Sự khác biệt giữa các process process.stdout.write và các console.log của Pháp trong node.js?


323

Sự khác biệt giữa "process.stdout.write" và "console.log" trong node.js là gì?

EDIT: Sử dụng console.log cho một biến cho thấy rất nhiều ký tự không thể đọc được trong khi sử dụng process.stdout.write hiển thị một đối tượng.

Tại sao vậy?


4
bạn có thể cung cấp một ví dụ? console.log () gọi process.stdout.write với đầu ra được định dạng. Xem định dạng () trong console.js để thực hiện.
TK-421

Câu trả lời:


324

console.log()các cuộc gọi process.stdout.writevới đầu ra được định dạng. Xem format()trong console.js để thực hiện.

Hiện tại (v0.10.ish):

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

34
Cũng đáng đề cập rằng console.log()dường như để thêm một dòng mới
jchook

144

Nhìn vào các tài liệu Node rõ ràng console.log chỉ là process.stdout.write với một ngắt dòng ở cuối:

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

Nguồn: http://nodejs.org/docs/v0.3.1/api/ process.html # process.stdout


18
Đối với những người xuất hiện sau đó, xin lưu ý rằng v0.3.1 đã có từ lâu và mọi thứ đã thay đổi kể từ đó. :)
Brendan

5
... Không. Chỉ cần nhìn vào v0.9.9 docs và console.log vẫn chỉ là một bí danh cho process.stdout.write với một ngắt dòng. Hãy làm nghiên cứu của bạn trước khi bình luận. nodejs.org/docs/v0.9.9/api/ process.html # process.stdout
Mauvis Ledford

13
1) v0.9.9 là hai tuổi 2) tài liệu đó không chính xác, vì v0.9.9, định dạng được nội suy thông qua việc sử dụng
Brendan

4
Trên thực tế, có vẻ như tài liệu đó chưa bao giờ được cập nhật và vẫn còn tồn tại (DRY có ai không?). Tôi sẽ gửi PR để khắc phục điều đó, cảm ơn vì đã thông báo cho tôi về vấn đề đó :)
Brendan


66

Tôi biết đây là một câu hỏi rất cũ nhưng tôi không thấy ai nói về sự khác biệt chính giữa process.stdout.writeconsole.logvà tôi chỉ muốn đề cập đến nó.

Như Mauvis LefordTK-421 đã chỉ ra, nhân vật này console.logthêm một line-breakký tự ở cuối dòng ( \n) nhưng đó không phải là tất cả những gì nó làm.

Mã đã không thay đổi kể từ ít nhất là 0.10.Xphiên bản và bây giờ chúng tôi có một 5.Xphiên bản.

Đây là mã:

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

Như bạn có thể thấy, có một phần nói .apply(this, arguments)và điều đó tạo ra sự khác biệt lớn về chức năng. Nó dễ dàng hơn để giải thích rằng với các ví dụ:

process.stdout.write có một chức năng rất cơ bản, bạn có thể viết một cái gì đó trong đó, như thế này:

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

Nếu bạn không đặt dòng ngắt ở cuối, bạn sẽ nhận được một ký tự lạ sau chuỗi của mình, đại loại như thế này:

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

(Tôi nghĩ điều đó có nghĩa là "kết thúc chương trình", vì vậy bạn sẽ chỉ thấy nó nếu bạn process.stdout.writeđược sử dụng ở cuối tệp của mình và bạn đã không thêm dòng ngắt)

Mặt khác, console.logcó thể làm nhiều hơn nữa.

  1. Bạn có thể sử dụng nó theo cùng một cách

    console.log("Hello World"); //You don't need the break line here because it was already formated và nhân vật kỳ lạ đó đã biến mất

  2. Bạn có thể viết nhiều hơn một chuỗi

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

  3. Bạn có thể làm cho các hiệp hội

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

Một phần, đó là chức năng bổ sung được đưa ra nhờ util.format.applymột phần (tôi có thể nói rất nhiều về chính xác điều này làm gì nhưng bạn hiểu ý tôi, bạn có thể đọc thêm ở đây ).

Tôi hy vọng ai đó tìm thấy thông tin này hữu ích.


Sẽ rất hữu ích nếu bạn giải thích cách sử dụng stdout.writevà tránh nhận%
Muhammad Aref

Tôi đã giải quyết vấn đề nhận được %ở cuối bằng cách gọi process.stdout.write('\n');vào cuối vòng lặp của tôi (nếu bạn có ví dụ)
Muhammad Aref

2
Đây %chỉ là cách của shell để nói rằng không có dòng mới ở cuối tập tin.
Dave Newton

1
@DaveNewton quan điểm của bạn rất quan trọng, vì điều đó có nghĩa là nếu bạn đang chuyển hướng đầu ra của chương trình sang một tệp, chẳng hạn, bạn sẽ không nhận được điều đó %trong tệp
mr.mams

31

Một sự khác biệt lớn chưa được đề cập là process.stdout chỉ lấy các chuỗi làm đối số (cũng có thể là các luồng được truyền), trong khi console.log lấy bất kỳ loại dữ liệu Javascript nào.

ví dụ:

// 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)

15

Một sự khác biệt quan trọng trong bối cảnh này sẽ với process.stdout.clearLine()process.stdout.cursorTo(0).

Điều này sẽ hữu ích nếu bạn muốn hiển thị phần trăm tải xuống hoặc xử lý trong một dòng duy nhất. Nếu bạn sử dụng ClearLine (), con trỏTo () với console.log()nó không hoạt động vì nó cũng nối thêm \ n vào văn bản. Chỉ cần thử ví dụ này:

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

Đây là những gì tôi đang tìm kiếm. Cảm ơn.
Patrick P.

5

Tôi vừa nhận thấy điều gì đó trong khi nghiên cứu vấn đề này sau khi nhận trợ giúp với https.request cho phương thức đăng bài. Nghĩ rằng tôi chia sẻ một số đầu vào để giúp hiểu.

process.stdout.writekhông thêm một dòng mới trong khi console.logđó, như những người khác đã đề cập. Nhưng cũng có điều này dễ giải thích hơn với các ví dụ.

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

process.stdout.write(d);sẽ in dữ liệu đúng cách mà không cần một dòng mới. Tuy nhiên console.log(d)sẽ in một dòng mới nhưng dữ liệu sẽ không hiển thị chính xác, <Buffer 12 34 56...ví dụ như vậy.

Để console.log(d)hiển thị thông tin chính xác, tôi sẽ phải làm điều này.

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

Nên về cơ bản:

  • process.stdout.write liên tục in thông tin khi dữ liệu được lấy và không thêm một dòng mới.

  • console.log in thông tin những gì thu được tại điểm truy xuất và thêm một dòng mới.

Đó là cách tốt nhất tôi có thể giải thích nó.


1

Sự khác biệt đơn giản là: các phương thức console.log () tự động nối thêm ký tự dòng mới. Điều đó có nghĩa là nếu chúng ta lặp qua và in kết quả, mỗi kết quả sẽ được in trong dòng mới.

Các phương thức process.stdout.write () không nối thêm ký tự dòng mới. hữu ích cho việc in các mẫu.


0

Console.log triển khai process.sdout.write, process.sdout.write là bộ đệm / luồng sẽ trực tiếp xuất ra trong bảng điều khiển của bạn.

Theo puglin tôi serverline : console = new Console(consoleOptions)bạn có thể viết lại lớp Console của riêng bạn readline hệ thống.

Bạn có thể thấy nguồn mã của console.log:


Xem thêm:

  • readline.createInterface để thực hiện hành vi tùy chỉnh của bạn hoặc sử dụng đầu vào bảng điều khiển.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.