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

服务端代码

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次,所以重现起来都很难
10 回复

代码都用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次,所以重现起来都很难

请问这个问题最终怎么解决,我也遇到这个问题,很是纠结,请各位大神指点指点。。谢谢

请问这个问题最终怎么解决,我也遇到这个问题,很是纠结,请各位大神指点指点。。谢谢

@djt-alsan 先保证进程只有一个,如果还会发生就不懂了,我这边也没有解决,不是每次都会出现,偶尔

找到可能原因所在,如果在模板文件或者html文件里面有多个脚本文件引入,客户端就会多次发送请求,触发多次connection事件,另外img图片资源请求等等都有可能触发多次吧

回到顶部