2012-12-01 19 views
14

Başka birinden çalıştırmak istediğim bir komut dosyası var. Sorun, çocuk betiğinin (işlem) devam etmeden önce bir kullanıcı girdisine ihtiyacı olmasıdır.Püskürtme işlemine stdin nodejs yazılıyor mu?

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'); 
}); 

Verilerimi girdikten sonra, altyazı devam etmeli, ancak bunun yerine orada kalmalıdır.

Çözüm

Aslında yukarıdaki kod benim için çalışır. Kullanıcının harekete geçmesini istemek için çocuk komut dosyasına commander.js kullanıyorum. Burada bir çocuğun senaryo istemine yanıt nasıl: suppose ile

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

Aynı şey iş:

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

Sadece bir düşünce: Eğer sırayla 'stdin' sona gerekiyor senaryon cevap verecek mi? Ayrıca bkz .: http://nodejs.org/api/stream.html#stream_stream_end – skeggse

+0

Dokümanlardan: Bu akışın son() yoluyla kapatılması genellikle çocuk sürecinin sonlandırılmasına neden olur. - http://nodejs.org/api/child_process.html#child_process_child_stdin Ve bunu doğrulayabildiğim çocuk sürecini sonlandırıyor. – simo

cevap

11

Paketi suppose kullanabilirsiniz. Unix Expect gibi. Tam açıklama, ben yazarım. Github sayfasındaki örnekte itibaren

, sen scripting bunun bir örneğini görebilirsiniz NPM: https://github.com/jprichardson/node-suppose

Örnek:

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

Çocuk betiğimde bir sorun var gibi görünüyor, çünkü * ile * çalışmaz *. Çocuğunuzun harekete geçmesini istemek için çocuk komutumda * commander.js * kullanıyorum. Belki bu sorun bir şekilde .. – simo

+0

Ben ilk komut isteminde bir boşluk beyaz boşluk karakter eksikti ama sanırım bu * commander.js * özgü bir şey. Her neyse, modülünüz benim için çalışıyor, böylece cevabınızı işaretleyeceğim. – simo