Node.js: एक अनुगामी न्यूलाइन के बिना कंसोल को प्रिंट करना?


683

क्या एक अनुगामी न्यूलाइन के बिना कंसोल पर मुद्रण के लिए एक विधि है? consoleवस्तु प्रलेखन कि के बारे में कुछ नहीं कहा:

console.log()

नई रेखा के साथ प्रिंट करने के लिए प्रिंट। यह फ़ंक्शन कई printf()तरह के तर्क दे सकता है । उदाहरण:

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

यदि सूत्र बनाने वाले तत्व पहले स्ट्रिंग में नहीं मिलते हैं, तो util.inspectप्रत्येक तर्क पर उपयोग किया जाता है।

जवाबों:


1058

आप उपयोग कर सकते हैं process.stdout.write():

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

देखें जानकारी के लिए डॉक्स


7
इससे मेरे लिए विपरीत समस्या हल हो गई। console.logमुद्रण किया गया था \nसचमुच जब मैं एक नई पंक्ति चरित्र मुद्रित करने के लिए यह करना चाहता था।
पॉल

@Paulpro newline char '\ n' नहीं है?
अलेक्जेंडर मिल्स

3
@AlexMills यह एक नए चरित्र के लिए भागने का क्रम है, लेकिन यह खुद एक नया चरित्र नहीं है। मैं एक शाब्दिक ` followed by an n` प्राप्त कर रहा था , जब मैं एक वास्तविक newline चरित्र का उत्पादन करना चाहता था।
पॉल

379

उदाहरण के लिए, यदि आप एक ही पंक्ति में संदेशों को ओवरराइट करना चाहते हैं, उदाहरण के लिए एक उलटी गिनती में, आप स्ट्रिंग के अंत में '\ r' जोड़ सकते हैं।

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

18
हालांकि सवाल का जवाब नहीं, यह एक अद्भुत जवाब है। कोशिश करने के लिए इंतजार नहीं कर सकता।
लोंगड़ा

8
यह मेरे लिए विंडोज पर काम नहीं करता है । लेकिन नॉन-डाउंस पर बढ़िया काम करता है।
चौबे

45
विंडोज के लिए, आप समकक्ष कोड '\ 033 [0G' का उपयोग कर सकते हैं, जैसे:process.stdout.write("Downloading " + data.length + " bytes\033[0G");
GarciadelCastillo

19
सख्त मोड में काम करने के लिए @GarciadelCastillo द्वारा एक टिप्पणी में ऊपर दिए गए एसीसी एस्केप कोड बनाने के लिए , इस तरह \033हेक्स शाब्दिक के साथ ऑक्टल शाब्दिक को बदलें :। (जो सख्त और गैर-सख्त दोनों कोडों के साथ काम करता है)\x1b\x1b[0G
कुछ

7
बस विंडोज में काम करने के लिए स्ट्रिंग के अंत में शुरुआत में \ r डालें।
daremkd

20

विंडोज कंसोल (लिनक्स, भी) में, आपको '\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
@ शेव टॉप खास है, ऐसा कुछ नहीं जिसे आप एएनएसआई से बच सकते हैं। यह वास्तव में, ncurses का उपयोग करता है, यही वजह है कि आप इसे एम्बेडेड सिस्टम पर नहीं पाएंगे, जिसमें बड़े C लिबास नहीं हैं
cat

1
@ चेहेव: अधिकांश लोग आपको अपने स्वयं के FUD के कारण हार्डकोडेड एस्केप दृश्यों के साथ खेलने से मना करेंगे, लेकिन लगभग सभी लोग अब VT100 का उपयोग करते हैं, इसलिए संगतता वास्तव में कोई मुद्दा नहीं है। जिस कार्यक्षमता की आप बात कर रहे हैं, वह "वैकल्पिक स्क्रीन" व्यवहार है। एक बुनियादी परिचय man console_codes(लिनक्स या ऑनलाइन पर) में पाया जा सकता है और मेरा पसंदीदा संदर्भ www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs ( ) है (इसकी 99% सामग्री अभी भी काम करती है) । केवल चेतावनी: व्यापक रूप से तैनात करने से पहले कई अलग-अलग टर्मिनलों पर किसी भी प्रयोग का परीक्षण करने के लिए तैयार रहें।
०३६_

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

use.print का उपयोग भी किया जा सकता है। पढ़ें: http://nodejs.org/api/util.html#util_util_print

use.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अब पदावनत किया गया है
पेट्र पेलर

(node:7616) DeprecationWarning: util.print is deprecated. Use console.log instead.
ग्रीन

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'एक नई लाइन का उपयोग करके मैक ओएसएक्स 10.9.2 पर ओवरराइट नहीं करता है।

संपादित करें: मुझे वर्तमान लाइन को बदलने के लिए इसका उपयोग करना था:

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

4

सख्त मोड का उपयोग करने पर मुझे निम्न त्रुटि मिली:

नोड त्रुटि: "ऑक्टल शाब्दिक को सख्त मोड में अनुमति नहीं है।"

निम्नलिखित समाधान काम करता है ( स्रोत ):

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

ऑक्सलेट शाब्दिक tobsone.orher संख्यात्मक प्रारूप
फ्रांसेस्कोएम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.