2012-12-01 34 views
14

मेरे पास एक स्क्रिप्ट है जिसे मैं किसी अन्य से चलाने के लिए चाहता हूं। समस्या यह है कि बच्चे स्क्रिप्ट (प्रक्रिया) को जारी रखने से पहले उपयोगकर्ता इनपुट की आवश्यकता होती है।spawned प्रक्रिया stdin nodejs को लिखें?

var child = spawn('script'); 
child.stdin.setEncoding('utf8'); 
child.stdout.on('data', function (data) { 
    console.log(data.toString().trim()); // tells me to input my data 
    child.stdin.write('my data\n'); 
}); 

मेरे डेटा इनपुट करने के बाद बच्चे स्क्रिप्ट जारी रहनी चाहिए, बल्कि इसके बजाय यह वहां लटका है।

समाधान

वास्तव में उपर्युक्त कोड मेरे लिए काम करता है। मैं उपयोगकर्ता को कार्रवाई के लिए संकेत देने के लिए बाल स्क्रिप्ट में commander.js का उपयोग कर रहा हूं। यहाँ कैसे मैं एक बच्चे की स्क्रिप्ट शीघ्र करने के लिए जवाब है:

child.stdout.on('data', function (data) { 
    switch (data.toString().trim()) { 
     case 'Username:': 
      child.stdin.write('user'); 
      break; 
     case 'Password:': 
      child.stdin.write('pass'); 
      break; 
    } 
}); 

suppose के साथ भी यही बात काम:

var suppose = require('suppose'); 

suppose('script') 
    .on('Username: ').respond('user') 
    .on('Password: ').respond('pass') 
.error(function (err) { 
    console.log(err.message); 
}) 
.end(function (code) { 
    console.log(code); 
    done(); 
}); 
+0

बस एक विचार: यदि आप 'के लिए क्रम में stdin' खत्म करने की जरूरत है आपकी स्क्रिप्ट का जवाब देने के लिए? यह भी देखें: http://nodejs.org/api/stream.html#stream_stream_end – skeggse

+0

दस्तावेज़ों से: इस स्ट्रीम को अंत() के माध्यम से बंद करना अक्सर बच्चे की प्रक्रिया को समाप्त करने का कारण बनता है। - http://nodejs.org/api/child_process.html#child_process_child_stdin और यह बाल प्रक्रिया को समाप्त कर देता है जिसे मैं इसकी पुष्टि कर सकता हूं। – simo

उत्तर

11

आप पैकेज suppose इस्तेमाल कर सकते हैं। यह Unix Expect जैसा है। पूर्ण प्रकटीकरण, मैं लेखक हूं।

Github पृष्ठ पर उदाहरण से, आप इसके बारे में एक उदाहरण देख सकते स्क्रिप्टिंग NPM: https://github.com/jprichardson/node-suppose

उदाहरण:

var suppose = require('suppose') 
suppose('script') 
.on(/\w*/).respond('my data\n') 
.end(function(code){ 
    console.log('Done: ' + code); 
}) 
+0

मेरे बच्चे की स्क्रिप्ट के साथ कुछ समस्या प्रतीत होती है क्योंकि यह * मान लीजिए * के साथ काम नहीं करती है। मैं कार्रवाई के लिए उपयोगकर्ता को संकेत देने के लिए अपने बच्चे स्क्रिप्ट में * commander.js * का उपयोग कर रहा हूं। हो सकता है कि यह किसी तरह से समस्या है .. – simo

+0

मुझे पहले संकेत में एक पिछला सफेद अंतरिक्ष चरित्र याद आ रहा था, लेकिन मुझे लगता है कि यह * commander.js * के लिए विशिष्ट है। वैसे भी आपका मॉड्यूल मेरे लिए काम करता है, इसलिए मैं आपका जवाब चिह्नित करूंगा। – simo