2015-01-20 13 views
5

Diciamo che ho un parent.js contenente un metodo chiamato parentCome passare la funzione/callback al processo figlio in Node.js?

var childProcess = require('child_process'); 

var options = { 
    someData: {a:1, b:2, c:3}, 
    asyncFn: function (data, callback) { /*do other async stuff here*/ } 
}; 

function Parent(options, callback) { 
    var child = childProcess.fork('./child'); 
    child.send({ 
     method: method, 
     options: options 
    }); 
    child.on('message', function(data){ 
     callback(data,err, data,result); 
     child.kill(); 
    }); 
} 

Nel frattempo in child.js

process.on('message', function(data){ 
    var method = data.method; 
    var options = data.options; 
    var someData = options.someData; 
    var asyncFn = options.asyncFn; // asyncFn is undefined at here 
    asyncFn(someData, function(err, result){ 
     process.send({ 
      err: err, 
      result: result 
     }); 
    }); 
}); 

mi chiedevo se le funzioni di passaggio al processo figlio non è consentito in Node.js.

Perché lo asyncFn diventa undefined dopo essere stato inviato allo child?

E 'relativo a JSON.stringify?

risposta

6

JSON non supporta le funzioni di serializzazione (almeno fuori dalla scatola). È possibile convertire prima la funzione nella sua rappresentazione di stringa (tramite asyncFn.toString()) e quindi ricreare nuovamente la funzione nel processo figlio. Il problema però è che perdi la portata e il contesto con questo processo, quindi la tua funzione deve essere autonoma.

completo esempio:

parent.js:

var childProcess = require('child_process'); 

var options = { 
    someData: {a:1, b:2, c:3}, 
    asyncFn: function (data, callback) { /*do other async stuff here*/ } 
}; 
options.asyncFn = options.asyncFn.toString(); 

function Parent(options, callback) { 
    var child = childProcess.fork('./child'); 
    child.send({ 
    method: method, 
    options: options 
    }); 
    child.on('message', function(data){ 
    callback(data,err, data,result); 
    child.kill(); 
    }); 
} 

child.js:

process.on('message', function(data){ 
    var method = data.method; 
    var options = data.options; 
    var someData = options.someData; 
    var asyncFn = new Function('return ' + options.asyncFn)(); 
    asyncFn(someData, function(err, result){ 
    process.send({ 
     err: err, 
     result: result 
    }); 
    }); 
}); 
+0

Aww, mi ha battuto ad esso: P – loganfsmyth

+0

è 'new Function ('ritorno' + funcString)() ; 'sicuro per codice non affidabile? – M4GNV5

+0

@ M4GNV5 No, dovresti invece utilizzare il modulo 'vm' in un processo figlio con le protezioni appropriate a livello di sistema operativo per essere sicuro con" codice non attendibile ". – mscdex

Problemi correlati