2012-02-10 27 views
17

मेरे पास एक node.js स्क्रिप्ट/सर्वर है जो लॉन्च होने पर stdin से कुछ इनपुट पढ़ता है। हालांकि, कभी-कभी पास करने के लिए कोई डेटा नहीं होता है। यह परेशानी है क्योंकि ऐसा लगता है कि इस मामले में न तो data और न ही end ईवेंट कहा जाता है। Node.js कोड में यह मामला कब पता लगा सकता है?node.js: खाली स्टडीन स्ट्रीम का पता कैसे लगाएं?

मैं इनपुट के अंत में विशेष "अंत" पात्रों को जोड़ने से बचना चाहता हूं, ताकि ग्राहक को असुविधा न हो। जुड़े कोड के नीचे है:

var newHTML = ''; 
    var gfm = spawn(__dirname + '/node_modules/docter/bin/github-flavored-markdown.rb'); 
    process.stdin.on('data', function(chunk){ 
    gfm.stdin.write(chunk); 
    }); 
    process.stdin.on('end', function(){ 
    gfm.stdin.end(); 
    }); 
    gfm.stdout.on('data', function(data) { 
    newHTML += data; 
    }); 
    gfm.on('exit',function(ecode){ 
    socket.emit('newContent', newHTML); 
    }); 
    process.stdin.resume(); 
+1

आप process.stdin.on की कोशिश की है ('त्रुटि', समारोह() {})? – Marshall

+0

या gfm.stdout.on ('त्रुटि', फ़ंक्शन() {}) – Marshall

+0

एक समाधान मिला? यह असंभव प्रतीत होता है। – antitoxic

उत्तर

3

एक खाली या कोई STDIN धारा process.stdin से end घटना से पता चला है।

यह सरल स्क्रिप्ट stdin.js यह दर्शाता है कि:

process.stdin.on('data', function(data) { console.log(data) }); 
process.stdin.on('end', function() { console.log('EOF') }); 

विभिन्न परिदृश्य:

$ echo test | node stdin.js 
<Buffer 74 65 73 74 0a> 
EOF 
$ echo -n | node stdin.js 
EOF 
$ node stdin.js < /dev/null 
EOF 
$ 

यह स्क्रिप्ट pipe.js यह दर्शाता है कि एक पैदा बच्चे की प्रक्रिया के लिए पाइप का उपयोग कर बहुत अच्छी तरह से काम करता है:

var spawn = require('child_process').spawn; 
var cat = spawn('/bin/cat'); 
cat.stdout.on('data', function(data) { console.log(data) }); 
cat.stdout.on('end', function() { console.log('EOF') }); 

process.stdin.pipe(cat.stdin); 

अपेक्षित के रूप में:

$ echo test | node pipe.js 
<Buffer 74 65 73 74 0a> 
EOF 
$ echo -n | node pipe.js 
EOF 
$ node pipe.js < /dev/null 
EOF 
$ 
4

मुझे विश्वास है कि क्या हो रहा है, आप बिल्कुल एक स्टडीन भाप नहीं दे रहे हैं।

Øystein Steimler के उदाहरण आप अपने एप्लिकेशन में खिला /dev/बातिल पता चलता है:

नोड pipe.js </dev/बातिल

हालांकि, कभी नहीं संबोधित जब आप स्ट्रीम न करें ऐप के लिए stdin बिल्कुल। बस node pipe.js चलाना बाहर नहीं निकलेगा क्योंकि यह अभी भी stdin का इंतजार कर रहा है।

आप स्वयं इस अन्य यूनिक्स कार्यक्रमों के साथ परीक्षण कर सकते हैं, उदाहरण के लिए cat

इस चलाने की कोशिश करें: यह है क्योंकि यह बाहर निकलने नहीं है

cat 

: बस चलाने की कोशिश

cat < /dev/null 

अब stdin के लिए इंतजार कर रहा है। आप टर्मिनल में टाइप कर सकते हैं और एंटर दबाकर प्रोग्राम को भेज सकते हैं। यह अभी भी बाहर निकल जाएगा नहीं है (और अधिक इनपुट के लिए प्रतीक्षा) जब तक यह EOF प्राप्त करता है जो आप ctrl साथ क्या कर सकते +

+2

यह कब हो रहा है जब मैं यह पता लगा सकता हूं? मुझे कोई 'रीडलाइन'' क्लोज़ 'या' process.stdin' 'end' ईवेंट नहीं मिलता है। – spiffytech

1

कुछ आप कर सकते हैं अपने अनुप्रयोग -s की तरह एक तर्क को स्वीकार करने के लिए है जो यह stdin से पढ़ता है।

कि क्या LiveScript के CLI उपकरण करता है:

-s, --stdin read stdin