मेरे पास एक स्क्रिप्ट है जिसे मैं किसी अन्य से चलाने के लिए चाहता हूं। समस्या यह है कि बच्चे स्क्रिप्ट (प्रक्रिया) को जारी रखने से पहले उपयोगकर्ता इनपुट की आवश्यकता होती है।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();
});
बस एक विचार: यदि आप 'के लिए क्रम में stdin' खत्म करने की जरूरत है आपकी स्क्रिप्ट का जवाब देने के लिए? यह भी देखें: http://nodejs.org/api/stream.html#stream_stream_end – skeggse
दस्तावेज़ों से: इस स्ट्रीम को अंत() के माध्यम से बंद करना अक्सर बच्चे की प्रक्रिया को समाप्त करने का कारण बनता है। - http://nodejs.org/api/child_process.html#child_process_child_stdin और यह बाल प्रक्रिया को समाप्त कर देता है जिसे मैं इसकी पुष्टि कर सकता हूं। – simo