【问题标题】:client connecting twice to server, Socket.io客户端两次连接到服务器,Socket.io
【发布时间】:2015-09-12 01:40:14
【问题描述】:

我正在尝试通过使用 passport.socketio 将 socket.io 连接到 passport.js 来记录登录用户的用户名。它是成功的,但是它记录了用户名两次,在尝试并搜索了相当长的时间后我被卡住了。

代码部分如下:

服务器代码:

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>

输出如下:

successful connection to socket.io
UserName has connected
UserName has connected

我不确定为什么它会输出两次任何帮助将不胜感激。我对 Node.js 比较陌生,但我不认为是护照部分导致了它,但是我被卡住了,所以我可能没有最好的主意。

感谢进阶

编辑: 尝试了最新版本的套接字并检查了我自己的版本似乎都是最新版本,只是为了确保我将客户端代码更新为:

<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>

问题依然存在

【问题讨论】:

标签: javascript node.js socket.io passport.socketio


【解决方案1】:

我发现问题是我自己的愚蠢,

成功授权后,我接受了两次连接。因此,它注册了所有内容两次,更正应该是:

function onAuthorizeSuccess(data, accept){
  console.log('successful connection to socket.io');
  //accept(null, true); -> remove this line
  accept();
}

【讨论】:

    【解决方案2】:

    这显然是以前版本中的错误。您可能只需要升级。看看下面的问题。 https://github.com/Automattic/socket.io/issues/350

    将来,如果您尝试调试此类问题,熟悉Node Events Class Documentation 会很有用。 io 只是一个事件侦听器,这里发生的事情是出于某些原因,connection 事件正在执行双重任务。

    可能是一些 Socket.io 代码触发了emit('connection') 太多次。

    当我调试这样的东西时,调用emitter.listeners('event') 会很有用,因为它会告诉我谁,更重要的是有多少听众在听。

    因此,在您的情况下,io.listeners('connection'); 将为您提供一系列正在收听该事件的所有人。很明显,io 注册了两次,但是你可能会发现这个技巧在哪里。

    另外,进入包本身并搜索emit('connection'); 会告诉你那个讨厌的错误在哪里。

    【讨论】:

    • 我已经拥有最新版本的套接字,甚至尝试将其添加到客户端以确保(参考我所做的编辑),我也尝试过 io.listeners('connection') 但它给出了一个错误of:TypeError: undefined is not a function 将监听器称为未定义函数。
    • 哎呀,这意味着那里有一个事件监听器,他们已经用on 方法搞砸了。我会在问题中发布 Node、NPM、IO 和您所使用的操作系统的版本。同时,您可以尝试挖掘他们的源代码,看看on 方法的真正作用。
    • @user2967697 您的客户端库过期。当前版本是1.3.5。你的服务器是什么版本的?
    • 我刚查了一下,说服务器版本是1.3.5。
    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多