Javascript 客户端两次连接到服务器Socket.io

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

我试图通过使用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('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。