2014-09-30 86 views
0

我需要在節點中運行不安全的JS腳本,並能夠從錯誤中恢復。 腳本可以使用異步函數,所以我使用contextify而不是VM模塊中內置的節點。 問題是腳本中的異步代碼中的錯誤會使節點進程崩潰。Contextify:如何捕捉異步錯誤

這裏是我的測試:

var contextify = require('contextify'); 
var context = { 
    console:{ 
     log:function(msg){ 
      console.log('Contextify : '+msg); 
     } 
    }, 
    setTimeout:setTimeout 
}; 
console.log("begin test"); 
contextify(context); 
try{ // try to run unsafe script 
    //context.run("console.log('Sync user script error');nonExistingFunction();"); // works 
    context.run("setTimeout(function(){ console.log('Async user script error');nonExistingFunction(); },2000);"); // crash node process 
}catch(err){ 
    console.log("Recover sync user script error"); 
} 
console.log("end test"); 

我如何能趕上異步錯誤?

//main.js

var child_process = require('child_process'); 

var script = child_process.fork("scriptrunner.js"); 
script.on('error',function(err){ 
    console.log("Thread module error " + JSON.stringify(err)); 
}); 
script.on('exit',function(code,signal){ 
    if(code==null) 
     console.log("Script crashed"); 
    else console.log("Script exited normally"); 
}); 
script.send("setTimeout(function(){ console.log('Async user script error');nonExistingFunction(); },2000);"); 

//scriptrunner.js

var contextify = require('contextify'); 

var context = { 
    console:{ 
     log:function(msg){ 
      console.log('Contextify : '+msg); 
     } 
    }, 
    setTimeout:setTimeout 
}; 
contextify(context); 

process.on('message', function(js) {    
    try{   
     context.run(js); 
    }catch(err){ 
     console.log("Catch sync user script error " + err); 
    } 
}); 

回答

0

我用child_process創建一個線程的腳本執行中的問題解決了所以現在如果腳本崩潰,它會崩潰它自己的進程而不是主節點進程。缺點是我無法在我的主進程和腳本的線程之間傳遞複雜的對象(比如我的上下文),所以我需要爲此找到解決方法。

+0

我還在使用contextiy來運行腳本。我有相反的問題。如何知道symxtify實例內的異步函數何時成功完成並可將結果返回給父進程?提前致謝! – LPG 2016-05-13 22:14:57