2014-09-01 35 views
0

我想在主進程中捕獲我的子進程的一些響應。我可以在主進程中記錄子進程的信息,但無法捕獲一些返回xyz響應。 這裏是主進程的代碼:如何在nodejs中捕獲子進程的響應

var express = require('express'); 
var app = express(); 
const 
      fs = require('fs'), 
      cp = require('child_process'); 
app.get('/',onRequest); 
    function onRequest(request, response) { 
       var express = require('express'); 
      var app = express(); 

      var child= cp.spawn('node' ,['./child_process/block.js'],filestreamCallback); 
      child.stdout.on('data', function(data) { 
       console.log('stdout: ==== ' + data); 
      }); 
      child.stderr.on('data', function(data) { 
       console.log('stdout: ' + data); 
      }); 
      child.on('close', function(code) { 
       console.log('closing code: ' + code); 
      }); 
     function filestreamCallback() { 
       response.writeHead(200, {'Content-Type': 'text/plain'}); 
       baflog.info("Reading Stream completed"); 
       response.write('Thanks for Your patience!\n'); 
       response.end(); 
      } 
     } 
     app.listen(5000); 
     console.log('Server started'); 

Child process : block.js 

     /*Keep waiting for 10 seconds*/ 

    console.log("Waiting for child Process (block.js) to complete......"); 
    var startTime = new Date().getTime(); 
    while (new Date().getTime() < startTime + 10000); 
    ret_resp(); 
    var response = {status:'success'}; 
    function ret_resp(){ 
     return response; 
    } 
    console.log("Thank You for waiting......"); 

像控制檯I看到輸出爲: 標準輸出====:等待子流程(block.js)來完成...... -punws -sohan

標準輸出:====讓您久等了......

我不能看到回報迴應聲明 輸出任何人都可以建議如何捕捉子進程的響應?

回答

2

首先,繁忙循環耗盡了不必要的CPU時間。改爲使用setTimeout()。例如:

setTimeout(function() { 
    ret_resp(); 
    // ... 
}, 10000); 

其次,你不能指望return奇蹟般地寫返回值給父進程。試試這個,而不是:

// parent.js 
var child = cp.fork('./child_process/block.js', [], { silent: true }); 
child.stdout.on('data', function(data) { 
    console.log('stdout: ==== ' + data); 
}); 
child.stderr.on('data', function(data) { 
    console.log('stdout: ' + data); 
}); 
child.on('message', function(msg) { 
    console.log('message from child: ' + require('util').inspect(msg)); 
}); 
child.on('close', function(code) { 
    console.log('closing code: ' + code); 
}); 


// child.js 
console.log('Waiting for child Process (block.js) to complete......'); 
setTimeout(function() { 
    var response = {status:'success'}; 
    function ret_resp() { 
    process.send(response); 
    } 
    ret_resp(); 
    console.log('Thank You for waiting......'); 
}, 10000); 
+0

你正在包裝消息在日誌中,我不想這樣做。我想要像叉子一樣。 process.send(msg)然後主進程接收消息。它可能與叉,但我不能看到派生/執行的方式。 – Sohan 2014-09-01 15:13:08

+0

我已經更新了包含'fork()'用法的答案。 – mscdex 2014-09-01 15:28:31

+0

我得到錯誤 child_process.js:402 拋出新的TypeError('message can not be undefined'); ^ 類型錯誤:消息不能被在process.target.send未定義 (child_process.js:402:13)在ret_resp (d:\節點的js \ baflog \ child_process \ block.js:16:17) 在空._onTimeout(d:\ Node Js \ baflog \ child_process \ block.js:13:5) at Timer.listOnTimeout [as ontimeout](timers.js:112:15) 結束代碼:8 – Sohan 2014-09-01 16:38:40

相關問題