把socket监听事件放在 app.js 文件中,emit() 和 on() 事件都能正常执行,但是如果把socket监听放到express的一个控制器里面,代码就会出现重复执行,重复的次数跟websocket连接个数相等,关键代码如下:
...app.js关键代码
var io = require('socket.io')(server);
io.on('connection', function(socket){
socket.emit('hi', 'hehehe');
socket.on('hehe', function(data){
console.log(data);
});
console.log(new Date()+' test');
})
这样的代码可以正常执行,但是如果将上面的代码放到express的控制器里面就会出现问题:
...app.js关键代码
var io = require('socket.io')(server);
app.use('/users', users.test(io));
...users.js关键代码
exports.test = function(io){
return function(req, res){
res.render('user', {'title': 'test'});
io.on('connection', function(socket){
socket.emit('hi', 'hehehe');
socket.on('hehe', function(data){
console.log(data);
});
console.log(new Date()+' test');
});
}
这样之后访问 localhost:3000/users 服务器下的输出内容跟websocket连接数相关,比如打开一个页面,console.log(data)这行会输出一次,刷新一次页面,则这行会输出两次,新建一个标签页打开这个页面的效果跟刷新一样,就好像在控制器下的socket监听的是所有的连接,为什么会出现这种情况?
如果socket要跟session交互,这个时候该怎么处理?