2012-12-01 50 views
14

我有一個腳本,我想從另一個運行。問題在於,子腳本(進程)在繼續之前需要用戶輸入。寫入產生的進程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

從文檔:通過end()關閉此流通常會導致子進程終止。 - 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

我的子腳本似乎存在一些問題,因爲它不適用於* suppose *。我在我的子腳本中使用* commander.js *來提示用戶採取行動。也許這是在某種程度上的問題.. – simo

+0

我錯過了第一個提示中的一個尾隨空白字符,但我想這是* commander.js *特定的東西。無論如何,你的模塊爲我工作,所以我會標記你的答案。 – simo