2016-05-17 9 views
1

Ich werde damit beginnen zu sagen, ich habe mehrere ähnliche Probleme auf dieser Website veröffentlicht. Keiner von ihnen trifft jedoch auf meine Situation zu.socket.io emittieren feuern dreimal

Ich habe einen Server und einen Client (wie ist die Norm mit node.js/socket.io) und call emittieren ein Socket-Ereignis, wenn eine Taste gedrückt wird. Das funktioniert gut ... Außer es scheint dreimal zu emittieren (zumindest der Server führt die Funktion dreimal aus). Ich habe den Code an diesem Punkt viel zu lange angeguckt und brauche noch ein paar Augen.

Hoffentlich hat jemand eine Idee.

Client-Code:

importJS('/js/pages/admin_base.js',function(){ 
    var restartLMC = function(io){ 
     toggleLoad(); 
     var user = localStorage.getItem('User'); 
     io.emit('restart_request',{session: user}); 
    }; 
    AdminIO = new io('http://localhost:26266'); 
    AdminIO.on('restart_success',function(dat){ 
     toggleLoad(); 
     dropInfo(dat); 
    }); 
    AdminIO.on('sendError',function(dat){ 
     dropInfo(dat,{level: 'error'}); 
    }); 
    AdminIO.on('restart_fail',function(dat){ 
     toggleLoad(); 
     dropInfo(dat,{level: 'error'}); 
    }); 
    $('#restart').on('click',function(){ 
     restartLMC(AdminIO); 
    }); 
}); 

Code Admin:

process.stdout.write('\033c'); 
console.log('\x1b[36m', "Admin server starting...", '\x1b[0m'); 
var 
    ini = require('node-ini') 
    , conf = ini.parseSync('../config.ini') 
    , CS = require('../lm_modules/CoreSync.js') 
    , CoreSync = new CS() 
    , checkSession = function (session, callback) { 
      var res; 
      if (!CoreSync) { throw "Fatal error, there is no connection to the Core service!"; } 
      if (CoreSync.sessions) { 
       if (CoreSync.sessions[session]) { 
        res = CoreSync.sessions[session]; 
        callback(res); 
       } 
       else { 
        CoreSync.sync('session', function (err, dat) { 
         if (CoreSync.sessions[session]) { 
          res = CoreSync.sessions[session]; 
          callback(res); 
         } else { res = false; callback(res); } 
        }); 
       } 
      } else { 
       res = false; callback(res); 
      } 
      if (res === "undefined") { callback(false); } 
     } 
    , runCMD = function(cmd,errCB,callback){ 
     var 
      command 
      , args; 
     if(cmd.cmd){ command = cmd.cmd; } else { command = cmd; } 
     if(cmd.args){ args = cmd.args; } 
     const spawn = require('child_process').spawn;   
     const ex = spawn(command, args); 
     ex.stdout.on('data', (data) => { 
      callback(data); 
     }); 
     ex.stderr.on('data', (data) => { 
      errCB(data); 
     }); 
     ex.on('close', (code) => { 

     }); 
    }  
    , executeCMD = function(cmd,callback){ 
     const exec = require('child_process').exec 
       , cdw = (__dirname + '/../'); 
     exec(cmd, {cwd: cdw}, (err, stdout, stderr) => { 
      if (err) { 
       callback(err,null); 
       return; 
      } 
      callback(stderr,stdout); 
     }); 
    }  
    , io = require('socket.io').listen(26266) // can use up to 26485 

console.log('\x1b[32m', "Admin server started.", '\x1b[0m'); 
console.log("Admin server listening at " + "http://" + conf["Server"]["binding"] + ":26266"); 
io.on('connection', function (socket) { 
    socket.on('restart_request', function(req){ 
     console.log('Recieved restart request');  
     var success = false 
      , session = JSON.parse(req.session) 
      , sessionID = session.sessionID; 
     checkSession(sessionID, function (ses) { 
      if (ses === false) { console.error('CheckSession failed: No session exists'); return; } 
      if (ses.user.uuid !== session.uuid) { console.error('CheckSession failed: UUID mismatched'); return; } 
      if (ses.user.role < conf['Permissions']['lm_restart']){ socket.emit('restart_fail','Insufficient permissions.'); return; } 
      if(process.platform === 'win32'){    
       executeCMD('cd',function(err,res){ 
        var errSent = false; 
        if(err){       
         console.error(err); 
         if(!errSent){ socket.emit('sendError','Restart failed'); } 
         errSent = true; 
         if(res === null){return;} 
        } 
        console.log(res); 
        socket.emit('restart_success','LM successfully restarted.'); 
       });     
      } 
      else if(process.platform === 'linux'){ 

      } 
     }); 
    }); 
}); 

Antwort

0

Für diejenigen, die dies gesehen haben kann und fand es eine merkwürdige Frage/Situation ... Ich fand zwei Teile dieses .

Der erste Teil ist die Bindung $(). Aus irgendeinem Grund (obwohl es im js-Code keineswegs mehrfach aufgerufen wird) hat das Hinzufügen von unbind() vor der Bindung das Problem teilweise gelöst ... es hat das Extra von 3 auf zwei reduziert (bis ich einen anderen gestartet habe) Server-App, dann ging es wieder bis zu drei ...)

Der andere Teil, den ich fand, war, dass (aus irgendeinem Grund) die socket.io-Verbindung so oft dupliziert wird, wie es Socket-Server ausgeführt werden. Weitere Details zu diesem Thema here ... Ich glaube, sobald mein Problem gefunden ist, wird mein Problem gelöst.