2013-05-03 16 views
26

Node.js akışlarını kullanarak parçaları bir araya nasıl aktaracağımı görüyorum, ancak bu komut dosyalarının bir kısmının uyumsuz olabileceğinden, Unix |'u kullanarak birden çok komut dosyasını nasıl bir araya getiriyorsunuz?Node.js komut dosyalarını Unix | boru (komut satırında)?

$ ./a.js | ./b.js 

Örnek:

#!/usr/bin/env node 

console.log(process.argv); 

Bu çıkış

(chmod 0755)

#!/usr/bin/env node 

setTimeout(function(){ 
    console.log(JSON.stringify({ foo: 'bar' })); 
}, 10); 

b.js (0755 chmod) a.js:

$ ./a.js | ./b.js 
[ 'node', '/Users/viatropos/tests/b.js' ] 

events.js:72 
     throw er; // Unhandled 'error' event 
      ^
Error: write EPIPE 
    at errnoException (net.js:883:11) 
    at Object.afterWrite (net.js:700:19) 

İlk bakışta çok fazla yanlışlık var gibi görünüyor, bu yüzden nereden başlayacağınızdan emin değilsiniz. Bunu işe almak için bir yolu var mı? Son hedef, 'dan console.log çıktısını alıp ./b.js içinde kullanabilmektir. Nedeni, çoğu zaman bu betiklerin birer birer çalıştırılacağı, ancak bazen bunları bir araya getirebilmenin güzel olacağı düşüncesiyle, ideal olarak sistem her iki durumu da ele alabilmelidir.

+0

http://stackoverflow.com/questions/15466383/how-to-detect-if-a-node-js-script-is-running-through-a-shell-pipe –

cevap

40

Sorun şu ki, b.jsa.js numaralı telefonun kendi standardını kapatıp kapatmasına neden oluyor, çünkü standart çıkışı kapatıldı ve bu olasılığı karşılamadınız. İki seçeneğiniz var: a.js'da stdout kapama işleminin üstesinden gelin veya girişi b.js içinde kabul edin. a.js Tespit

: o duruşu eklerseniz artık onun çıkışını okumaya kimse yokken

process.on("SIGPIPE", process.exit); 

, sadece vazgeçeceğim. Programınızın ne yaptığına bağlı olarak SIGPIPE üzerinde yapılacak daha iyi şeyler vardır, ancak anahtar console.log ini durdurmaktır. b.js Tespit

: Elbette

#!/usr/bin/env node 

var stdin = process.openStdin(); 

var data = ""; 

stdin.on('data', function(chunk) { 
    data += chunk; 
}); 

stdin.on('end', function() { 
    console.log("DATA:\n" + data + "\nEND DATA"); 
}); 

, sen do not bu verilerle bir şey yapmak var. Önemli olan, sürecin devam etmesini sağlayan bir şeye sahip olmaktır; Eğer ona boru yapıyorsanız, stdin.on('data', fx) yapmak yararlı bir şey gibi görünüyor.

Unutmayın, bunlardan biri bu hatayı engelleyecektir. Programları arasında boru tesisatı yapmayı planlıyorsanız, ikincinin en yararlı olacağını umuyorum.

+1

Bu en yararlıdır. Programın "piped" modunda (ya da buna ne demeli) kullanıldığını kontrol etmek bir şekilde mümkün olabilir mi? Örneğin, bir CLI programı için yararlı olacaktır: a) eğer çatallı olup olmadığını kontrol edin (eğer (process.send) {} ​​'), b) eğer değilse,“ piped mode ”içinde çalıştırılıp çağrılmadığını kontrol edin (örneğiniz gibi) veya) eğer değilse, sadece normal olarak çıkış yapınız. Bu şekilde CLI programı davanın kullanımına uyarlanabilir. ** edit **: cevabımı zaten buldu (http://nodejs.org/api/tty.html) – Fabdrol