Node.js: sondaki yeni satır olmadan konsola mı yazdırıyorsunuz?


683

Sondaki yeni satır olmadan konsola yazdırmak için bir yöntem var mı? consoleNesne dokümantasyon olduğunu dair hiçbir şey söylemez:

console.log()

Newline ile stdout'a yazdırır. Bu işlev, benzer bir printf()şekilde birden fazla argüman alabilir . Misal:

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

Biçimlendirme öğeleri ilk dizede bulunamazsa util.inspect, her bağımsız değişkende kullanılır.

Yanıtlar:


1058

Şunları kullanabilirsiniz process.stdout.write():

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

Ayrıntılar için dokümanlara bakın .


7
Bu benim için tam tersini çözdü. yeni satır karakteri yazdırmasını istediğimde tam anlamıyla console.logyazdırıyordu \n.
Paul

@Paulpro, yeni satır karakteri değil mi?
Alexander Mills

3
@AlexMills Yeni satır karakteri için kaçış dizisidir, ancak satır sonu karakterinin kendisi değildir. ` followed by an Gerçek bir satırsonu karakteri çıkarmak istediğimde gerçek bir `` alıyordum .
Paul

379

Ayrıca, aynı satırdaki, örneğin bir geri sayımdaki mesajların üzerine yazmak istiyorsanız, dizenin sonuna '\ r' ekleyebilirsiniz.

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

18
Sorunun cevabı olmasa da, bu inanılmaz bir cevap. Denemek için sabırsızlanıyorum.
longda

8
Bu mu değil benim için Windows üzerinde çalışır. Ama dows olmayanlarda harika çalışıyor.
chowey

45
Windows için, '\ 033 [0G' eşdeğeri kodunu şu şekilde kullanabilirsiniz:process.stdout.write("Downloading " + data.length + " bytes\033[0G");
GarciadelCastillo

19
Yapmak için ansi kaçış kod katı modda çalışmaya @GarciadelCastillo tarafından yorumunda yukarıda verilen, sekizlik düz yerine \033altıgen sabitin ile \x1bböyle: \x1b[0G. (hem katı hem de katı olmayan kodla çalışır)
bazı

7
Windows'da çalışmasını sağlamak için dizenin sonuna değil de \ r yerine başlangıç ​​yapın.
daremkd

20

Windows konsolunda (Linux da), '\r'eşdeğer koduyla değiştirmelisiniz \033[0G:

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

Bu, imleci ilk sütuna göndermek için bir VT220 terminal kaçış dizisi kullanır.


1
Yalnızca geçerli satır yerine birden çok satırı nasıl geri giderdiniz? Üst programı çalıştıran ve bitince ne orada geri yükler var iken benim tüm tampon geçersiz kılmak mümkün gibi görünüyor. Bunu nasıl yaptığını bilen var mı? i.imgur.com/AtCmEjn.gif
Chev

Muhtemelen bunlardan biri gibi bir şey kullandığına inanıyorum: github.com/mscdex/node-ncurses github.com/chjj/blessed
Brandon

1
Çalışıyor ama imleci de [\] 39var spinner = '|/-\\'.split('');process.stdout.write("["+this.randomElement(spinner)+"] "+message+"\033[0G");
beğeniyorum

1
@Chev Top özeldir, ANSI kaçış kodlarıyla yazabileceğiniz bir şey değildir. Gerçekten de ncurses kullanıyor, bu yüzden büyük C libleri olmayan gömülü sistemlerde bulamayacaksınız
cat

1
@Chev: Çoğu kişi kendi FUD'ları nedeniyle sizi sabit kodlu kaçış dizileriyle oynamanızdan vazgeçirecek, ancak neredeyse herkes VT100'ü şimdi kullanıyor, bu yüzden uyumluluk artık bir sorun değil. Bahsettiğiniz işlev "alternatif ekran" davranışıdır. Temel bir giriş man console_codes(Linux'ta veya çevrimiçi olarak) bulunabilir ve en sevdiğim referans www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/… (içeriğinin% 99'u hala çalışıyor) . Sadece uyarı: Yaygın olarak konuşlandırılmadan önce birkaç farklı terminalde yapılan deneyleri test etmeye hazır olun.
i336_

18

Bir satırın üzerine yazabilmek için yukarıdaki @ rodowi tarafından yapılan mükemmel eklemeye genişleme / geliştirme olarak:

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

Terminal imlecinin ilk karakterde olmasını istemiyorsanız, kodumda gördüğüm gibi, aşağıdakileri yapmayı düşünün:

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)

\rSonraki yazdırma ifadesinin önüne yerleştirildiğinde, imleç, değiştirilen dize bir öncekinin üzerine yazılmadan hemen önce sıfırlanır.


13

util.print de kullanılabilir. Okuyun: http://nodejs.org/api/util.html#util_util_print

util.print ([...]) # Senkron çıkış fonksiyonu. Süreci bloke eder, her argümanı bir dizeye yayınlar ve stdout'a çıkarır. Her argümandan sonra satırsonu koymaz.

Bir örnek:

// 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şimdi kullanımdan kaldırıldı
Petr Peller

(node:7616) DeprecationWarning: util.print is deprecated. Use console.log instead.
Yeşil

10

Birçok cevap var gibi görünüyor:

process.stdout.write

Hata günlükleri şu kaynaklarda yayınlanmalıdır:

process.stderr

Bunun yerine kullanın:

console.error

Neden bir process.stdout.write('\033[0G');şey yapmadığını merak eden herkes stdoutiçin arabelleğe alındı ve drainolayı beklemeniz gerekiyor ( daha fazla bilgi ).

Yazma geri dönerse falsebir drainolayı tetikler.


4

Bu çözümlerin hiçbiri benim için çalışmıyor process.stdout.write('ok\033[0G')ve sadece '\r'yeni bir satır oluşturmakla birlikte Mac OSX 10.9.2'de üzerine yazmayın.

EDIT: Geçerli satırı değiştirmek için bunu kullanmak zorunda kaldı:

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

4

Sıkı modu kullanırken aşağıdaki hatayı aldım:

Düğüm hatası: "Katı modda sekizli değişmez sayılara izin verilmiyor."

Aşağıdaki çözüm çalışır ( kaynak ):

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

Okltal değişmez değeri tobsone olarak değiştirin. Ya da başka sayısal biçim
FrancescoMM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.