2015-01-20 3 views
5

Скажем, у меня есть parent.js, содержащий метод, названный parentКак передать функцию/обратный вызов дочернему процессу в 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(); 
    }); 
} 

Между тем в 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 
     }); 
    }); 
}); 

мне было интересно, если передавая функции дочернего процесса не допускается в Node.js.

Зачем было asyncFn стать undefined после того, как оно отправлено на адрес child?

Связано это с JSON.stringify?

ответ

6

JSON не поддерживает функции сериализации (по крайней мере, из коробки). Сначала вы можете преобразовать функцию в ее строковое представление (через asyncFn.toString()), а затем снова создать функцию в дочернем процессе. Проблема в том, что вы теряете сферу и контекст с этим процессом, поэтому ваша функция действительно должна быть автономной.

Полный пример:

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, опередил меня: P – loganfsmyth

+0

является 'новая функция ('возвращение' + funcString)() ; 'безопасный для ненадежного кода? – M4GNV5

+0

@ M4GNV5 Нет, вам нужно будет использовать модуль 'vm' в дочернем процессе с соответствующими защитами на уровне ОС, чтобы быть в безопасности с« ненадежным кодом ». – mscdex

Смежные вопросы