Javascript 客户端两次连接到服务器Socket.io
我试图通过使用passport.socketio将socket.io连接到passport.js来记录已登录用户的用户名。它是成功的,但是它记录了两次用户名,在尝试和搜索了相当长的时间后,我被卡住了 代码部分如下:Javascript 客户端两次连接到服务器Socket.io,javascript,node.js,socket.io,passport.socketio,Javascript,Node.js,Socket.io,Passport.socketio,我试图通过使用passport.socketio将socket.io连接到passport.js来记录已登录用户的用户名。它是成功的,但是它记录了两次用户名,在尝试和搜索了相当长的时间后,我被卡住了 代码部分如下: successful connection to socket.io UserName has connected UserName has connected 服务器代码: var server = http.createServer(app); var io = require
successful connection to socket.io
UserName has connected
UserName has connected
服务器代码:
var server = http.createServer(app);
var io = require('socket.io')(server);
io.use(passportSocketIo.authorize({
cookieParser: cookieParser, // the same middleware you registred in express
key: 'connect.sid', // the name of the cookie where express stores its session_id
secret: 'hello', // the session_secret to parse the cookie
store: new (require("connect-mongo")(Esession))({
url: "mongodb://localhost/local"
}), // we NEED to use a sessionstore. no memorystore please
success: onAuthorizeSuccess, // *optional* callback on success - read more below
fail: onAuthorizeFail, // *optional* callback on fail/error - read more below
}));
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
accept(null, true);
accept();
}
function onAuthorizeFail(data, message, error, accept){
if(error)
throw new Error(message);
console.log('failed connection to socket.io:', message);
// We use this callback to log all of our failed connections.
accept(null, false);
// OR
// If you use socket.io@1.X the callback looks different
// If you don't want to accept the connection
if(error)
accept(new Error(message));
// this error will be sent to the user as a special error-package
// see: http://socket.io/docs/client-api/#socket > error-object
}
io.on('connection', function(socket) {
var userID = socket.request.user;
console.log(userID.tg+ " has connected")
});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
server.listen(port);
客户端代码
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect();
</script>
我不确定为什么它会输出两次,任何帮助都将不胜感激。我对Node.js比较陌生,但我不相信是passport部分导致了它,但是我被卡住了,所以我可能没有最好的主意
提前谢谢
编辑:
尝试了最新版本的socket并检查了我自己的版本,这两个版本似乎都是最新版本,只是为了确保我将客户端代码更新为:
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script src="https://cdn.socket.io/socket.io-1.3.2.js"></script>
<script>
var socket = io.connect();
</script>
var socket=io.connect();
问题仍然存在这显然是以前版本中的错误。您可能只需要升级。查看下面的问题。 在将来,如果您试图调试这样一个问题,熟悉这个问题是很有用的
io
只是一个事件侦听器,这里发生的事情出于某种原因,连接
事件正在执行双重任务
可能是某个Socket.io代码多次触发了emit('connection')
当我调试类似的东西时,调用emitter.listeners('event')
会很有用,因为它会告诉我是谁,更重要的是有多少侦听器正在侦听
所以在您的例子中,io.listeners('connection')
将为您提供一组收听该事件的所有人。显然,io
会注册它两次,但您可能会通过这个技巧找到它的位置
另外,进入包本身并对
emit('connection')进行grepping
将向您显示那个讨厌的bug所在的位置。这显然是以前版本中的一个错误。您可能只需要升级。查看下面的问题。
在将来,如果您试图调试这样一个问题,熟悉这个问题是很有用的io
只是一个事件侦听器,这里发生的事情出于某种原因,连接
事件正在执行双重任务
可能是某个Socket.io代码多次触发了emit('connection')
当我调试类似的东西时,调用emitter.listeners('event')
会很有用,因为它会告诉我是谁,更重要的是有多少侦听器正在侦听
所以在您的例子中,io.listeners('connection')
将为您提供一组收听该事件的所有人。显然,io
会注册它两次,但您可能会通过这个技巧找到它的位置
另外,进入包本身并对
emit('connection')进行grepping代码>会告诉你那个讨厌的错误在哪里。我发现了问题,我猜是我自己的愚蠢
我在成功授权后接受了两次连接。因此,它将所有内容记录两次,更正应为:
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
//accept(null, true); -> remove this line
accept();
}
我发现了问题,我猜是我自己的愚蠢
我在成功授权后接受了两次连接。因此,它将所有内容记录两次,更正应为:
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
//accept(null, true); -> remove this line
accept();
}
我已经有了最新版本的socket,甚至尝试将其添加到客户端以确保(参考我所做的编辑),我还尝试执行io.listeners('connection')
,但它给出了一个错误:TypeError:undefined不是一个函数
将侦听器称为未定义函数。哎哟,这意味着在某个地方有一个事件监听器,他们已经弄乱了
方法上的。我会在这个问题上发布Node、NPM、IO和您所使用的操作系统的版本。同时,您可以尝试挖掘他们的源代码,看看
方法上的到底做了什么。@user2967697您的客户端库已经过时了。目前的版本是1.3.5。你的服务器是什么版本?我刚检查过,它说服务器版本是1.3.5。我已经有了最新版本的socket,甚至尝试将其添加到客户端以确保(参考我所做的编辑),我还尝试执行io.listeners(“连接”)
但是它给出了一个错误:TypeError:undefined不是一个函数
将侦听器称为未定义的函数。哎呀,这意味着在某个地方有一个事件侦听器,而他们已经弄乱了
方法上的。我会在这个问题上发布Node、NPM、IO和您所使用的操作系统的版本。同时,您可以尝试挖掘他们的源代码,看看
方法上的到底做了什么。@user2967697您的客户端库已经过时了。目前的版本是1.3.5。你的服务器是什么版本的?我刚检查过,上面说服务器版本是1.3.5。