2016-05-17 81 views
1

我会先说我发现了这个网站上发布的几个类似问题。尽管如此,它们都不适用于我的情况。socket.io发射三次发射

我有一个服务器和客户端(与node.js/socket.io规范一样),并且在按下按钮时调用会发出套接字事件。这工作正常...除了似乎排放三次(至少服务器运行三次函数)。在这一点上,我一直盯着代码太长,需要另一套眼睛。

希望有人有一个想法。

客户端代码:

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); 
    }); 
}); 

管理员代码:

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'){ 

      } 
     }); 
    }); 
}); 

回答

0

对于那些你谁可能已经看到了这一点,并发现这是一个奇怪的问题/情形......我发现了两个环节进行。

第一部分是$()。on绑定。出于某种原因(即使在js代码中多次调用它),在绑定前添加unbind()部分地解决了问题......它将多余的部分从3减少到2(直到我开始另一个服务器应用程序,然后它回到了三个......)

我发现的另一部分是(由于某种原因)socket.io连接重复多次,因为运行的套接字服务器。关于这个问题的更多细节here ......我相信一旦找到这个原因,我的问题就会得到解决。