【发布时间】:2017-11-06 01:04:59
【问题描述】:
请帮我弄清楚为什么我的 socket.io 应用会触发太多的发出消息。
是的,我花了数周时间研究 socket.io 文档和相关的 stackO 问题,试验了我的函数和所有内容的嵌套,但我完全陷入了困境。
这应该允许“房间”中的人们对某个问题进行投票。每个客户获得一票(是、否或弃权)。问题是当有人投票时,它不能只添加一票,它会添加对套接字中人数的投票。例如,如果三个人在一个房间里,并且第一票投给“是”,则它会记录 3 次“是”票。我永远数不清!
客户网站:
var socket = io.connect('http://localhost');
const url = window.location.href;
let voteName = url.substring(url.lastIndexOf("/") + 1);
let notVoted = true;
$('.voteName').html(voteName.replace(/_/g, ' '));
function getRoom(){
return voteName;
}
socket.on('connect', () => {
// Connected, let's sign-up for to receive messages for this room
socket.emit('room', getRoom());
console.dir(socket.id);
});
function yea () {
if(notVoted){
socket.emit('yea',voteName);
console.log(voteName)
notVoted = false;
}
}
function nay () {
if(notVoted){
io.emit('nay',voteName);
notVoted = false;
}
}
function abs () {
if(notVoted){
io.emit('abs',voteName);
notVoted = false;
}
}
服务器端:
app.post('/votePick', (req, res) => {
let voteName = req.body.votePick;
res.send(voteName);
app.get('/'+voteName,(req,res)=>{
res.sendFile(__dirname + '/canvas.html');
});
var nsp = io.of('/');
io.sockets.on('connection', (socket) => {
socket.on('room', (voteName) => {
//TODO check if room exists
socket.join(voteName);
if(!db[voteName]) {
db[voteName]={'yea':0,'nay':0,'abs':0,'cnctCount':1};
io.emit('update',db[voteName]);
} else {
io.emit('update',db[voteName]);
}
});
socket.on('yea', (voteName)=>{
db[voteName].yea++;
io.emit('update',db[voteName]);
console.log(db[voteName].cnctCount);
});
socket.on('nay', (voteName)=>{
db[voteName].nay++;
io.emit('update',db[voteName]);
console.log(db[voteName]);
});
socket.on('abs', (voteName)=>{
db[voteName].abs++;
io.emit('update',db[voteName]);
console.log(db[voteName]);
});
});
});
我的完整仓库在这里: https://github.com/Bokeefe/sockerPractice
【问题讨论】:
-
应该
socket.emit('room', getRoom());是socket.emit('room', getRoom);? -
那只是返回房间名称,从URL中抓取,需要运行函数获取相关房间。
标签: javascript socket.io