在进程nodejs之间共享全局对象

我在使用Node.js进程时遇到麻烦

所以我有一个父/subprocess实现发送设备的GPS信息,我需要从父母和孩子之间的设备共享令牌。

我的问题是,不要分享这个对象,孩子总是要求一个新的tokwn。 而不是在到期之前使用它们。

我的代币是这样的:

{"token":"f93cefe254ca873755b3bbbdca2f4c94","timeout":300,"expire":1512552810822} 

而当我在runChilddebugging时,我总是得到不同的值radioAccess和每个新的令牌,我需要我向设备发出一个新的请求…

我可以做什么来持久化“radioAcess”全局对象?

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 < directoryFiles.length; j++) { var file = directoryFiles[j]; if (file.indexOf('Controller.js') > -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.radioAccess = radioAccess[deviceId] || {}; createLog('debug', __dirname, __filename.slice(__dirname.length + 1, -3), device.id, 'runParent', 'process.radioAccess ', process.radioAccess); process.on('message', function(data) { //receber mensagens do filho createLog('debug', __dirname, __filename.slice(__dirname.length + 1, -3), data.deviceId, 'runParent data', data); 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); } }); 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) { process.radioAccess = radioAccess[deviceId] || {}; createLog('debug', __dirname, __filename.slice(__dirname.length + 1, -3), device.id, 'runChild', 'process.radioAccess 1', process.radioAccess); if(!device) { process.exit(); return; } return Controllers.Gps.getRadioInfo('gps', 'info', {}, device).then(function (data) { createLog('debug', __dirname, __filename.slice(__dirname.length + 1, - 3), id, 'runChild', 'data', data); createLog('debug', __dirname, __filename.slice(__dirname.length + 1, -3), device.id, 'runChild', 'process.radioAccess 2', process.radioAccess); 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 = {}; 

我试图使用全局进程,并添加“process.radioAcess”,但父母总是给{}和孩子不能坚持令牌。

这是你如何做的一个工作的例子。 请注意尝试在进程初始化之前发送消息(例如,在two.js中),并在main.js中退出进程,使得two.js有机会向one.js发送一些消息

debugging这是非常困难的,我不知道为什么,但铬debugging器不能附加到subprocess,并不停止在debugging器语句。 也不显示subprocess的任何console.log语句。

main.js

 const fork = require('child_process').fork; const path = require('path'); const[one,two] = ["one.js","two.js"] .map( fileName => [path.resolve(fileName),fileName] ) .map( ([file,fileName]) => { const x = fork( file, [], { stdio: [ 'pipe', 'pipe', 'pipe', 'ipc' ], silent:false } ); x.stderr.on(//doesn't do anything 'error', data => console.log(`got error from ${fileName}:`,data) ); x.on( 'message', message => (message.type==="relay") ? one.send({type:"ping",text:`relayed from ${fileName}: ${message.text}`}) : console.log(`got message from ${fileName}:`,message.text) ); return x; } ); setTimeout( _=>{ //do this after two can send relayd message (after the send on the que from two) one.send({type:"ping",text:"hello one"}) one.send({type:"exit"}) two.send({type:"ping",text:"hello two"}) two.send({type:"exit"}) } ,100 ); 

two.js

 //process is impossible to debug: // debugger;//never breaks and about:inspect in chrome // after init doesn't show this process either // console.log("useless in forked process"); console.log doesn't show const processMessage = message => { switch (message.type) { case "exit": process.send({type:"string",text:"Going to exit."}); process.exit(0); break; case "ping": process.send({type:"string",text:message.text}); break; default: process.send({type:"string",text:"unknown message"}); } }; process.on( 'message', message => processMessage(message) ); //this part is not in one.js Promise.resolve() .then( //send message after main had time to initialize all processes x=>process.send({type:"relay",text:"HELLO THERE ONE"}) ) 

one.js

与two.js相同,但没有最后一部分。