2015-08-26 120 views
1

我有一個實時的應用程序,可以正常工作與express + passportJS和沒有套接字身份驗證。 當我添加passport.socketio,我的問題是,插座只會當我重新啓動服務器passport.socketio和客戶端連接/重新連接只有當重新啓動服務器

我已經得到& passport.socketio在服務器和客戶端上我已經passportjs連接...有angularjs與btford.socket-io

angular.module('Socket', ['btford.socket-io']) 

    .factory('socket',['socketFactory', function(socketFactory){ 
     var myIoSocket = io.connect("http://192.168.0.7:8080"); 

     mySocket = socketFactory({ 
      ioSocket: myIoSocket 
     }); 

     return mySocket; 
    }]); 

當用戶登錄時,我做socket.connect();。 這似乎並沒有做服務器端的東西,我沒有看到任何日誌...

這裏的落實,按照教程,passport.socketio的

var io = require('socket.io').listen(app.listen(port)); 
var passportSocketIo = require("passport.socketio"); 

io.use(passportSocketIo.authorize({ 
    cookieParser: cookieParser, 
    secret:  'secret', 
    store:  sessionStore, 
    success:  onAuthorizeSuccess, 
    fail:   onAuthorizeFail, 
})); 

function onAuthorizeSuccess(data, accept){ 
    log.debug('successful connection to socket.io'); 
    return accept(); 
} 

function onAuthorizeFail(data, message, error, accept){ 
    log.debug('unsuccessful connection to socket.io'); 
    if(error){ 
     throw new Error(message); 
    } 

    return accept(new Error(message)); 
} 

的奇怪的是,當我重新啓動服務器時,我可以看到很多日誌消息,顯示我嘗試連接的所有套接字實際上都連接

然後它似乎讓用戶通過套接字交換,並按預期工作。

任何人都知道可能發生了什麼?

回答

0

當客戶端打開頁面時,客戶端將連接,然後握手被初始化。然後服務器檢查身份驗證並強制斷開連接。然後,服務器不會檢查相同套接字連接的身份驗證(不會初始化握手)。您必須強制從客戶端連接一個新連接。

socket = io.connect(SOCKET_URL, {forceNew: true}); 

您的代碼

var myIoSocket = io.connect("http://192.168.0.7:8080",{forceNew: true}); 

我有同樣的問題,這解決了我的問題。如果你強制一個新的連接,我希望所有以前的事件監聽器都會丟失。您必須再次添加事件偵聽器。

+0

謝謝,這似乎工作 – user1144446

相關問題