Error: canal cerrado al enviar un mensaje de un niño a otro

Estoy tratando de pasar un mensaje de un niño a mi padre con un token.

Necesito hacer una solicitud q a un dispositivo para obtener información gps y cada niño tiene un token beacause en Node.js cada proceso tiene su propia variable global y no puedo compartir lo mismo donde tengo un token.

Así que para tener una var global, mi solución fue pasar el token lleno al padre y luego filtrar el mensaje en el padre y llenar la var global con el token recibido.

nsGPSService.js

require('./globals'); var listRoutDirectories = getDirectories(routeDirectory); for (var i = 0; i < listRoutDirectories.length; i++) { var directoryName = listRoutDirectories[i]; var directoryPath = routeDirectory + '/' + listRoutDirectories[i]; var directoryFiles = getFiles(directoryPath); for (var j = 0; j  -1) { global.Controllers[file.replace('Controller.js', '')] = require(directoryPath + '/' + file); } else if (file.indexOf('Model.js') > -1) { global.Models[file.replace('Model.js', '')] = require(directoryPath + '/' + file); } else if (file.indexOf('Database.js') > -1) { global.Database[file.replace('Database.js', '')] = require(directoryPath + '/' + file); } } } var child_process = require("child_process"); var argv = require('minimist')(process.argv.slice(2)); //ex: nsGPSService.js -d 1111-11-11-111 var deviceId = argv.d; var processDevices = []; function runParent () { setTimeout(function() { var numDevice = 1; createLog('info', __dirname, __filename.slice(__dirname.length + 1, -3), null, 'runParent', ""); return Database.Devices.getDevices().then(function (devices) { return new Promise(function (resolve, reject) { async.each(devices, function (device, callback) { var result = _.filter(processDevices, {"id": device.id}); if(result.length == 0) { logger.info('WSController-Service', 'runParent', 'getRadioInfo --> ', device.id, ' :: ', numDevice++, '/', devices.length); var process = child_process.fork(__dirname + '/nsGPSService.js', ["-d", device.id]); processDevices.push({ "process": process, "id": device.id }); process.on('message', function(data) { console.log("message received in parent with data ",data); //receber mensagens do filho if(data.reason == "deleted") { //child acabou o processo e informa o parent para remover da lista var index = _.findIndex(processDevices, {"id": data.deviceId}); processDevices.splice(index, 1); } if(data.action == "storeToken"){ radioAccess = data.radioAccess; } }); process.on('exit', function(code) { createLog('debug', __dirname, __filename.slice(__dirname.length + 1, -3), device.id, 'runParent', 'Exiting with code', code); }); process.on("uncaughtException", function (error) { createLog('error', __dirname, __filename.slice(__dirname.length + 1, -3), device.id, 'runParent', 'error', error); process.exit(1); }); } callback(); }, function(error) { // createLog('error', __dirname, __filename.slice(__dirname.length + 1, -3), null, 'runParent', 'error', error); error ? reject(error) : resolve(); }); }).then(function() { runParent() }).catch(function(error) { createLog('error', __dirname, __filename.slice(__dirname.length + 1, -3), null, 'runParent', 'catch error', error); runParent() }); }); },5000); } if(!deviceId) { createLog('info', __dirname, __filename.slice(__dirname.length + 1, -3), deviceId, 'runParent'); runParent(); } function runChild (id) { createLog('info', __dirname, __filename.slice(__dirname.length + 1, -3), id, 'runChild', ""); setTimeout(function() { return Database.Devices.getDeviceById(id).then(function(device) { if(!device) { process.exit(); return; } process.send({"action": "storeToken", "radioAccess": radioAccess[deviceId]}); return Controllers.Gps.getRadioInfo('gps', 'info', {}, device).then(function (data) { createLog('debug', __dirname, __filename.slice(__dirname.length + 1, - 3), id, 'runChild', 'data', data); return Controllers.Gps.sendDeviceInfo(data, device); }).then(function() { return runChild(id); }).catch(function (e) { createLog('error', __dirname, __filename.slice(__dirname.length + 1, - 3), id, 'runChild callback error', e); return runChild(id); }); }); }, 5000); } runChild(deviceId); 

globals.js

global.radioAccess = {};

Donde mi token se almacena en radioAccess global con este contenido:

 {"token":"fc7908e4a39c4a81e8c1e144c6f0fe65","timeout":300,"expire":1512567077360} 

Cada niño estaba haciendo una solicitud y cada proceso tiene una sesión diferente para el mismo dispositivo, mi solución es compartir la misma sesión hasta que caduque y comunicar este valor al padre porque en ella el valor de radioAccess si {}