Node.js: in ra bàn điều khiển mà không có dòng mới?


682

Có một phương pháp để in ra bàn điều khiển mà không có một dòng mới? Các consoleđối tượng tài liệu không nói bất cứ điều gì về điều đó:

console.log()

In ra thiết bị xuất chuẩn với dòng mới. Hàm này có thể lấy nhiều đối số printf()theo cách giống như. Thí dụ:

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

Nếu các phần tử định dạng không được tìm thấy trong chuỗi đầu tiên thì util.inspectđược sử dụng cho mỗi đối số.

Câu trả lời:


1056

Bạn có thể sử dụng process.stdout.write():

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

Xem tài liệu để biết chi tiết .


7
Điều này giải quyết vấn đề ngược lại cho tôi. console.logđã được in theo \nnghĩa đen khi tôi muốn nó in một ký tự dòng mới.
Paul

@Paulpro không phải là '\ n' char dòng mới?
Alexander Mills

3
@AlexMills Đó là chuỗi thoát cho một ký tự dòng mới, nhưng bản thân nó không phải là một ký tự dòng mới. Tôi đã nhận được một nghĩa đen ` followed by an , khi tôi muốn xuất ra một nhân vật dòng mới thực sự.
Paul

378

Ngoài ra, nếu bạn muốn ghi đè các tin nhắn trong cùng một dòng, ví dụ như trong đếm ngược, bạn có thể thêm '\ r' ở cuối chuỗi.

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

18
Mặc dù không phải là câu trả lời cho câu hỏi, đây là một câu trả lời tuyệt vời. Không thể chờ đợi để thử.
longda

8
Điều này không hoạt động trên Windows đối với tôi. Nhưng hoạt động tuyệt vời trên phi cảm.
cheyey

45
Đối với Windows, bạn có thể sử dụng mã tương đương '\ 033 [0G', như trong:process.stdout.write("Downloading " + data.length + " bytes\033[0G");
GarciadelCastillo

19
Để làm cho mã thoát ansi được đưa ra ở trên trong một nhận xét của @GarciadelCastillo để hoạt động ở chế độ nghiêm ngặt, hãy thay thế chữ bát phân \033bằng chữ hex \x1bnhư thế này : \x1b[0G. (hoạt động với cả mã nghiêm ngặt và không nghiêm ngặt)
một số

7
Chỉ cần đặt \ r ở đầu chứ không phải ở cuối chuỗi để làm cho nó hoạt động trong Windows.
daremkd

20

Trong bảng điều khiển Windows (Linux cũng vậy), bạn nên thay thế '\r'bằng mã tương đương của nó \033[0G:

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

Điều này sử dụng một chuỗi thoát thiết bị đầu cuối VT220 để gửi con trỏ đến cột đầu tiên.


1
Làm thế nào bạn sẽ quay trở lại nhiều dòng thay vì chỉ dòng hiện tại? Các đầu chương trình dường như có thể ghi đè toàn bộ đệm của tôi trong khi nó đang chạy và khôi phục những gì đã có khi nó được thực hiện. Bất cứ ai biết làm thế nào nó làm điều này? i.imgur.com/AtCmEjn.gif
Chev

Tôi tin rằng nó có thể sử dụng một cái gì đó giống như một trong số này: github.com/mscdex/node-ncurses github.com/chjj/blished
Brandon

1
Nó hoạt động nhưng tôi cũng nhận được con trỏ [\] 39và con trỏ được tô sáng trên char đầu tiên:var spinner = '|/-\\'.split('');process.stdout.write("["+this.randomElement(spinner)+"] "+message+"\033[0G");
loretoparisi

1
@Chev Top rất đặc biệt, không phải là thứ bạn có thể viết bằng mã thoát ANSI. Thật vậy, nó thực sự sử dụng ncurses, đó là lý do tại sao bạn sẽ không tìm thấy nó trên các hệ thống nhúng không có lib C lớn
con mèo

1
@Chev: Hầu hết mọi người sẽ không cho phép bạn chơi với các chuỗi thoát được mã hóa cứng do FUD của riêng họ, nhưng hầu như mọi người đều sử dụng VT100 ngay bây giờ, vì vậy khả năng tương thích không thực sự là vấn đề nữa. Chức năng bạn đang đề cập đến là hành vi "màn hình thay thế". Một phần giới thiệu cơ bản có thể được tìm thấy trong man console_codes(trên Linux hoặc trực tuyến) và tài liệu tham khảo yêu thích của tôi là www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/ tựa (99% nội dung của nó vẫn hoạt động) . Chỉ báo trước: Hãy chuẩn bị để thử nghiệm bất kỳ thử nghiệm nào trên một số thiết bị đầu cuối khác nhau trước khi triển khai rộng rãi.
i336_

18

Là một sự mở rộng / nâng cao cho sự bổ sung tuyệt vời được thực hiện bởi @rodowi ở trên về việc có thể ghi đè lên một hàng:

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

Nếu bạn không muốn con trỏ đầu cuối được đặt ở ký tự đầu tiên, như tôi đã thấy trong mã của mình, hãy xem xét thực hiện như sau:

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)

Bằng cách đặt \rphía trước câu lệnh in tiếp theo, con trỏ được đặt lại ngay trước khi chuỗi thay thế ghi đè lên trước đó.


13

util.print thể được sử dụng cũng có. Đọc: http://nodejs.org/api/util.html#util_util_print

produc.print ([...]) # Một chức năng đầu ra đồng bộ. Sẽ chặn quá trình, truyền từng đối số thành một chuỗi sau đó xuất ra thiết bị xuất chuẩn. Không đặt dòng mới sau mỗi đối số.

Một ví dụ:

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

39
util.printhiện không được chấp nhận
Petr Peller

(node:7616) DeprecationWarning: util.print is deprecated. Use console.log instead.
Màu xanh lá cây

10

Dường như có nhiều câu trả lời gợi ý:

process.stdout.write

Nhật ký lỗi nên được phát ra trên:

process.stderr

Thay vào đó sử dụng:

console.error

Đối với bất cứ ai tự hỏi tại sao process.stdout.write('\033[0G');không làm bất cứ điều gì vì nó stdoutđược đệm và bạn cần chờ drainsự kiện ( thông tin thêm ).

Nếu viết trả về falsenó sẽ bắn một drainsự kiện.


4

Không có giải pháp nào trong số này hoạt động với tôi process.stdout.write('ok\033[0G')và chỉ sử dụng '\r'chỉ tạo một dòng mới nhưng không ghi đè lên Mac OSX 10.9.2.

EDIT: Tôi đã phải sử dụng điều này để thay thế dòng hiện tại:

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

4

Tôi đã gặp lỗi sau khi sử dụng chế độ nghiêm ngặt:

Lỗi nút: "Không được phép sử dụng chữ bát phân trong chế độ nghiêm ngặt."

Các giải pháp sau đây hoạt động ( nguồn ):

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

Thay đổi định dạng số bằng chữ số bát phân. Định dạng số
FrancescoMM
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.