Node.js: การพิมพ์ไปยังคอนโซลโดยไม่ขึ้นบรรทัดใหม่หรือไม่


683

มีวิธีการพิมพ์ไปยังคอนโซลโดยไม่ขึ้นบรรทัดใหม่หรือไม่? consoleวัตถุเอกสารไม่ได้พูดอะไรเกี่ยวกับว่า

console.log()

พิมพ์ไปยัง stdout ด้วยการขึ้นบรรทัดใหม่ ฟังก์ชันนี้สามารถรับอาร์กิวเมนต์ได้หลายแบบในลักษณะprintf()เหมือนกัน ตัวอย่าง:

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

หากไม่พบองค์ประกอบการจัดรูปแบบในสตริงแรกutil.inspectจะใช้กับแต่ละอาร์กิวเมนต์

คำตอบ:


1058

คุณสามารถใช้process.stdout.write():

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

ดูเอกสารสำหรับรายละเอียด


7
สิ่งนี้แก้ไขปัญหาตรงข้ามสำหรับฉัน console.logกำลังพิมพ์อย่าง\nแท้จริงเมื่อฉันต้องการให้พิมพ์อักขระบรรทัดใหม่
พอล

@Paulpro ไม่ใช่อักขระขึ้นบรรทัดใหม่ '\ n'
Alexander Mills

3
@AlexMills เป็นลำดับ escape สำหรับอักขระขึ้นบรรทัดใหม่ แต่ไม่ใช่อักขระขึ้นบรรทัดใหม่ ฉันได้รับตัวอักษร` followed by an n` เมื่อฉันต้องการแสดงอักขระบรรทัดใหม่จริง
พอล

379

นอกจากนี้หากคุณต้องการเขียนทับข้อความในบรรทัดเดียวกันเช่นในการนับถอยหลังคุณสามารถเพิ่ม '\ r' ที่ส่วนท้ายของสตริง

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

18
แม้ว่าจะไม่ใช่คำตอบสำหรับคำถามนี้เป็นคำตอบที่น่าอัศจรรย์ อดใจรอไม่ไหว
longda

8
สิ่งนี้ไม่ทำงานบน Windows สำหรับฉัน แต่ใช้งานได้ดีกับคนที่ไม่ใช่ dows
chowey

45
สำหรับ Windows คุณสามารถใช้รหัสเทียบเท่า '\ 033 [0G' ดังที่:process.stdout.write("Downloading " + data.length + " bytes\033[0G");
GarciadelCastillo

19
ที่จะทำให้รหัส ANSI หลบหนีดังกล่าวข้างต้นในความคิดเห็นโดย @GarciadelCastillo การทำงานในโหมดเข้มงวดแทนที่ฐานแปดตัวอักษร\033ด้วยตัวอักษรฐานสิบหกเช่นนี้\x1b \x1b[0G(ใช้ได้กับทั้งรหัสที่เข้มงวดและไม่เข้มงวด)
บาง

7
เพียงใส่ \ r ที่จุดเริ่มต้นแทนที่จะเป็นจุดสิ้นสุดของสตริงเพื่อให้ทำงานใน Windows
daremkd

20

ในคอนโซล Windows (Linux เช่นกัน) คุณควรแทนที่'\r'ด้วยโค้ดที่เทียบเท่า\033[0G:

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

สิ่งนี้ใช้ลำดับการหยุดเทอร์มินัล VT220 เพื่อส่งเคอร์เซอร์ไปที่คอลัมน์แรก


1
คุณจะสำรองข้อมูลหลายบรรทัดได้อย่างไรแทนที่จะเป็นแค่บรรทัดปัจจุบัน ด้านบนโปรแกรมดูเหมือนว่าจะสามารถที่จะแทนที่บัฟเฟอร์ทั้งหมดของฉันในขณะที่มันทำงานและเรียกคืนสิ่งที่อยู่ที่นั่นเมื่อมันทำ ใครรู้ว่ามันทำเช่นนี้? i.imgur.com/AtCmEjn.gif
Chev

ฉันเชื่อว่ามันอาจใช้บางอย่างเช่น github.com/mscdex/node-ncurses github.com/chjj/blessed
Brandon

1
มันใช้งานได้ แต่ฉันได้เคอร์เซอร์มาเหมือนกัน[\] 39และเคอร์เซอร์ก็ถูกไฮไลต์บนตัวอักษรตัวแรก:var spinner = '|/-\\'.split('');process.stdout.write("["+this.randomElement(spinner)+"] "+message+"\033[0G");
loretoparisi

1
@Chev Top เป็นพิเศษไม่ใช่สิ่งที่คุณสามารถเขียนด้วยรหัสยกเว้น ANSI มันไม่จริงใช้ ncurses ซึ่งเป็นเหตุผลที่คุณจะพบว่ามันไม่เกี่ยวกับระบบฝังตัวที่ไม่ได้มี libs C ขนาดใหญ่
แมว

1
@Chev: คนส่วนใหญ่จะห้ามไม่ให้คุณเล่นกับลำดับการหลบหนี hardcoded เนื่องจาก FUD ของตัวเอง แต่เกือบทุกคนใช้ VT100 ตอนนี้ดังนั้นความเข้ากันได้จึงไม่เป็นปัญหาอีกต่อไป ฟังก์ชั่นที่คุณอ้างถึงคือพฤติกรรม "หน้าจอทางเลือก" คำแนะนำพื้นฐานสามารถพบได้ในman console_codes(บน Linux หรือออนไลน์) และการอ้างอิงที่ฉันโปรดปรานคือwww2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/ (99% ของเนื้อหายังคงใช้งานได้) . ข้อแม้เท่านั้น: เตรียมทดสอบการทดลองในเทอร์มินัลต่าง ๆ ก่อนนำไปใช้อย่างกว้างขวาง
i336_

18

ในฐานะที่เป็นส่วนขยาย / การเพิ่มประสิทธิภาพให้กับการเพิ่มที่ยอดเยี่ยมที่ @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)

โดยการวาง\rด้านหน้าของคำสั่งพิมพ์ถัดไปเคอร์เซอร์จะถูกรีเซ็ตก่อนที่สตริงการแทนที่จะเขียนทับหน้าที่ก่อนหน้า


13

util.printสามารถใช้งานได้เช่นกัน อ่าน: http://nodejs.org/api/util.html#util_util_print

util.print ([... ]) # ฟังก์ชั่นเอาต์พุตแบบซิงโครนัส จะบล็อกกระบวนการโยนแต่ละอาร์กิวเมนต์ไปยังสตริงแล้วส่งออกไปยัง stdout ห้ามวางบรรทัดใหม่หลังจากแต่ละอาร์กิวเมนต์

ตัวอย่าง:

// 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.printเลิกใช้แล้วตอนนี้
Petr Peller

(node:7616) DeprecationWarning: util.print is deprecated. Use console.log instead.
Green

10

ดูเหมือนจะมีคำตอบมากมายที่แนะนำ:

process.stdout.write

บันทึกข้อผิดพลาดควรถูกปล่อยออกมาใน:

process.stderr

ใช้แทน:

console.error

สำหรับทุกคนที่สงสัยว่าทำไมprocess.stdout.write('\033[0G');ไม่ทำอะไรเลยเพราะstdoutบัฟเฟอร์และคุณต้องรอdrainเหตุการณ์ ( ข้อมูลเพิ่มเติม )

ถ้าการเขียนส่งคืนfalseจะเป็นการเริ่มdrainเหตุการณ์


4

วิธีการแก้ปัญหาเหล่านี้ใช้ไม่ได้สำหรับฉันprocess.stdout.write('ok\033[0G')และใช้'\r'เพียงแค่สร้างบรรทัดใหม่ แต่ไม่เขียนทับบน Mac OSX 10.9.2

แก้ไข: ฉันต้องใช้สิ่งนี้เพื่อแทนที่บรรทัดปัจจุบัน:

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

4

ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อใช้โหมดเข้มงวด:

ข้อผิดพลาดโหนด: "ไม่อนุญาตให้ใช้ตัวอักษรฐานแปดในโหมดเข้มงวด"

โซลูชันต่อไปนี้ใช้งานได้ ( แหล่งที่มา ):

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

เปลี่ยนรูปแบบตัวเลขตัวอักษร toltone.orher ocltal
FrancescoMM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.