Узел: дочерний процесс.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

Программы прекрасно работают на одном сервере. Я попытался создать отдельный рабочий сервер, скопировав все файлы, и я начал получать эту ошибку. Конечно, в программах есть гораздо больше, чем в коде, показанном выше. Я чувствую, что пропустил какую-то установку или что-то тривиальное. Я посмотрел на детский процесс.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 2

1 ответ:

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

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