node.js+socket.io出现重复执行方法
发布于 16天前 作者 youkewanzi 271 次浏览 最后一次编辑是 15天前 来自 问答

服务端代码

var fs=require(‘fs’); var vm = require(‘vm’);

var journey = require(‘journey/journey’);

var http=require(‘http’);

var url = require(“url”);

var querystring = require(“querystring”);

var connect=require(“connect”);

var jsonData;

var router = new(journey.Router);

router.map(function() {

this.post(/^\/node?(?:\/(\d+)(?:\.\.(\d+))?)?/).bind(function(req, res, data) {

    typeMethod(jsonData);

    

    res.sendBody("bbb");

    res.send(200);

});

});

var sio = require(‘socket.io’);

var express = require(‘express’); //console.log(express) //var app = module.export = express.createServer();

var app=module.export=http.createServer(function(request, response) {  
    var body = "";    
    request.on('data', function(chunk) {
        body += chunk;
    jsonData = querystring.parse(body);
    });  
    request.on('end', function() {  
        router.handle(request, body, function(result) {  
            response.writeHead(result.status, result.headers);  
            response.end(result.body);  
        });  
    });  
}).listen(6380);  \n```


var socketUser = {};
var queueUser={};

io  = sio.listen(app);

io.sockets.on('connection', function (socket){
   //响应连接

   io.sockets.emit('conn', { text: 'socketId:'+socket.id});

   //公共称登陆方法
   socket.on('queueLogin', function (data) {
       console.log("loginllllllll");
       if(!queueUser.hasOwnProperty(socket.id)) {
           queueUser[socket.id] = {'c_id':data.c_id,'socket':socket};
           //在线人数+1
           //onlineCount++;
       }
   });


   //监听断线

   socket.on('disconnect', function(){

       console.log('-链接断开['+socket.id+']-');

       delete queueUser[socket.id];
   });

});

//推送给一个在线的人
var pushOne = function(data){

 console.log('-推送数据['+data+']-');
 var ioData=data;
 for(var values in queueUser){
     if(queueUser[values].c_id==ioData.openId){
          console.log('匹配人员'+ioData.openId);
          queueUser[values].socket.emit('receiveWeight',{'data': ioData});
          break;
       }
  }    

};


var typeMethod=function(data,req,res){
    var param=eval("("+data.data+")");
    var type=eval("("+data.type+")");
    switch(type){
        case 1:
            pushOne(param);
            break;
    }
};



客户端代码

var socket=‘';
function connSocketIO(openId){
    
    socket = io.connect(ip+":6380",
            {
             "reconnect":false,
             //"reconnect":false,
             "auto connect":false,
                //"reconnectionDelay":100,
             "connect timeout":100
            }
    );
    
    socket.on('conn', function (data) {

     var postdata = {
           'c_id'   : openId,     //用户id
     };

        socket.emit('queueLogin', postdata);

    });
    
    //接收体重数据
    socket.on('receiveWeight', function (data,fn) {

        console.log("1");
    });

    socket.connect();
    
}


现在是遇到,我发一个post请求访问node.js,调用一次相应的方法,然后出现接收到多次消息的问题,例如:理想是页面接收一次’你好‘的消息,实际接收到多次’你好‘
现在是运用在手机web上的,然后是有一定几率会出现,重复执行多次也没有规律,多的有6-7次,所以重现起来都很难
6 回复

代码都用md语法处理一下比较好,阅读起来比较难,现在

@youkewanzi

  • 社区的编辑器是支持MD的,尽量还是不要用图片来显示代码,应为不同屏幕效果可能不一样,不少用户是用手机客户端,阅读难。

  • 你没有提供你的控制台信息

  • 你的问题应该通过添加一些console.log()追踪一下就可以解决

我是新手发帖,谢谢提醒,控制台追踪的时候只出现过, var app=module.export=http.createServer(function(request, response) {
var body = "";
request.on('data’, function(chunk) { body += chunk; jsonData = querystring.parse(body); });
request.on('end’, function() {
router.handle(request, body, function(result) {
response.writeHead(result.status, result.headers);
response.end(result.body);
});
});
}).listen(6380); 这里面的请求有过重复执行,不过还是没找到原因,问题还不知道怎么重现,不是每次都会出现的。控制台信息随后跟上。

你这样就已经缩小问题范围了,你的意思是http的request事件出发多次 事实上用浏览器访问http服务器是会有两次request的,有一次是请求favicon

var http = require('http');
var server = http.Server(function(req, res) {
        console.log('request');
        res.end('hello world');
});

server.listen(8080);

你用浏览器访问localhost:8080就能打印两次request

@dayuoba 这个我排除了,我用在手机web上的,然后是有一定几率会出现,重复执行多次也没有规律,多的有6-7次,所以重现起来都很难

回到顶部