请帮我弄清楚为什么我的socket.io应用程序会激发太多的消息。
是的,我花了几周的时间讨论socket.io文档和相关的stackO问题,尝试了我的函数嵌套和一切,但我只是完全卡住了。
这应该允许人们进入一个房间。就某个问题投票。每个客户获得一票(是,不,或弃权)。问题是当有人投票时,它不能只添加一票就增加对套接字中人数的投票。例如,如果有三个人在一个房间,并且第一次投票是为了表示“是”。它注册3x' yea'票。我不能得到一个好计数!
客户端网站:
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
答案 0 :(得分:0)
您应该进行用户验证。没有人可以阻止客户端上的代码被更改,因此您始终需要检查服务器端。例如,您可以存储已经投票的套接字ID:
const voted = new Set;
然后在套接字事件处理程序中:
if(voted.has(socket)) return;
voted.add(socket);
//vote
这也应该解决od票数两次的问题。