2016-05-15 2 views
1

Я получаю сообщение об ошибке при использовании process.send в дочернем процессе, как в:Узел: child_process.js: 427 throw new TypeError («Этот тип дескриптора не может быть отправлен»);

process.send(someObject, function() { 
    .... 
}); 

Дочерний процесс создается как в:

var child = require('child_process'); 
var forkedProcess = child.fork(nodeScriptFile); 

Ошибка:

child_process.js:427 
      throw new TypeError("This handle type can't be sent"); 
       ^
    TypeError: This handle type can't be sent 

Программы отлично работают на одном сервере. Я попытался создать отдельный производственный сервер, скопировав все файлы, и я начал получать эту ошибку. Конечно, программы намного больше, а затем код, показанный выше. Я чувствую, что упустил какую-то установку или что-то тривиальное. Я посмотрел на ребенка-process.js код и ошибка вызывается из этого кода:

if (handle instanceof net.Socket) { 
    message.type = 'net.Socket'; 
    } else if (handle instanceof net.Server) { 
    message.type = 'net.Server'; 
    } else if (handle instanceof process.binding('tcp_wrap').TCP || 
      handle instanceof process.binding('pipe_wrap').Pipe) { 
    message.type = 'net.Native'; 
    } else if (handle instanceof dgram.Socket) { 
    message.type = 'dgram.Socket'; 
    } else if (handle instanceof process.binding('udp_wrap').UDP) { 
    message.type = 'dgram.Native'; 
    } else { 
    throw new TypeError("This handle type can't be sent"); 
    } 

потратили много времени ... Пожалуйста, помогите !!!

+1

Вы используете функцию обратного вызова для 'process.send()'? Я уверен, что ошибка вызвана этим. – robertklep

+0

@robertklep Да, я использую функцию обратного вызова для обработки отправки. Однако я делал это на другом сервере. После прочтения вашего комментария я проверил с версиями Nodejs. Тот, на котором он работает, - это v4.4.3, и на котором он не работал, был v. .10 или что-то в этом роде! Я обновился до версии 4.4.3, и он отлично работает. Если вы опубликуете свой комментарий в качестве ответа, я буду рад принять его, поскольку я подозреваю, что в старой версии не было обратного вызова process.send, и поэтому он интерпретировал обратный вызов как дескриптор? Просьба уточнить в ответе, который вы публикуете. – Sam

ответ

1

В старой версии узла (0.10 и, возможно, 0.12) process.send() был синхронным, поэтому он не принял функцию обратного вызова. Однако он принял необязательный второй аргумент, sendHandle.

В вашем случае, когда вы использовали более старую версию узла, возникла ошибка, потому что аргумент функции обратного вызова не был допустимым аргументом для .send(), и поэтому он прошел все тесты , которые вы указали в своем вопросе.