我有一个非常基本的例子。这个问题之前曾多次被问到堆栈溢出本身,但我无法得到正确的答案,所以我将使用这个基本的例子。
服务器:
Text
客户:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(3000);
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
io.on('connection', function (socket) {
socket.on('chat', function (data) {
var op = false;
if( data.id == '1234' ){
op = 'yes';
}else{
op = 'no';
}
socket.emit('result', { hello: op });
});
});
第一次单击“测试我”按钮时 socket.emit('结果',{hello:' world'}); 它被发射一次。在控制台中,我正在打印:
<html>
<body>
<button onclick="check()">Test Me :-)</button>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:3000');
var check = function(){
var data = { id : '234'};
socket.emit('chat', data);
socket.on('result', function(data){
console.log('The data is '+data)
})
}
</script>
</body>
</html>
但是当我再次点击时,我打印了三次:
console.log('The data is '+data)
当我第三次点击时,我会被打印六次:
console.log('The data is '+data)
console.log('The data is '+data)
console.log('The data is '+data)
就像这样,它正在成倍增加。
任何人都可以告诉我如何解决这个问题的见解。 非常感谢您的帮助。谢谢!
答案 0 :(得分:14)
我认为你正在增加越来越多的听众以及“结果”。你打的每个电话都要检查。
首次点击 - &gt;从call 1 listener调用1 console.log
第二次点击 - &gt;从调用1监听器调用1 console.log +从调用1监听器调用2 console.log从调用2监听器调用2 console.log
第三次 - &gt;以前的日志+从调用1监听器调用3 console.log +从调用2监听器调用3 console.log并从调用3监听器调用3 console.log。
尝试将听众放入&#39;结果&#39;超出功能:
<html>
<body>
<button onclick="check()">Test Me :-)</button>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:3000');
socket.on('result', function(data){
console.log('The data is '+data)
})
var check = function(){
var data = { id : '234'};
socket.emit('chat', data);
}
</script>
</body>
</html>
答案 1 :(得分:1)
对于客户端,您可以使用socket.once()代替socket.on() 例如-
socket.once('result', function(data){
console.log('The data is '+data)
})
答案 2 :(得分:0)
我没有阅读问题,但是我将其放在此处以帮助其他人,因为我还没有找到这种答案。
就我而言,我多次调用函数next
,就像这样
io.use(async (socket, next) => {
let req = socket.request
let res = req.res || {}
someMiddleware()(req, res, next)
anotherMiddleware({extended: false})(req, res, next)
anotherMiddleware()(req, res, next)
anotherMiddleware(req, res, next)
anotherMiddleware()(req, res, next)
anotherMiddleware()(req, res, next)
})
每次我调用中间件时,都会调用next
函数,而也会调用on('connection')
。我要做的是覆盖next
并将其放在最后一个中间件中,因此连接仅被调用一次。
. . .
let originalNext = next
next = () => {} // NOW its not going to annoy anymore
someMiddleware()(req, res, next)
anotherMiddleware({extended: false})(req, res, next)
anotherMiddleware()(req, res, next)
anotherMiddleware(req, res, next)
anotherMiddleware()(req, res, next)
anotherMiddleware()(req, res, originalNext) //next get called <
. . .