2012-08-06 98 views
1

我使用Node.jsExpress Framework)創建網站並使用Passportjs進行身份驗證。我使用socket.io在客戶端和服務器之間進行通信。我的網站顯示哪些用戶在線。我想要的是,當客戶端關閉其選項卡或瀏覽器本身而不退出網站,我想從該網站時'disconnect'事件觸發被註銷的用戶。代碼片段應該看起來像在server一側。Node.js/Socket.io/Passport.js註銷問題

io.sockets.on('connection', function (socket) { 
socket.on('disconnect', function() { 
    console.log("|||||| DISCONNECTED ||||||"); 
    //LOGOUT USER CODE 
}); 
}); 

我使用Passportjs的本地策略。它在CouchDB數據庫中搜索用戶,並在用戶名/密碼組合正確的情況下登錄。

我的解決方案,它顯然是行不通的:

app.configure(function() { 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'ejs'); 
    app.use(express.logger()); 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.static(__dirname + '/')); 
    app.use(express.session({ secret: 'keyboard cat'})); 
    // Initialize Passport! Also use passport.session() middleware, to support 
    // persistent login sessions (recommended). 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 

    //a new custom middleware to logout the user when the pathname is '/exit'  

    app.use(function(req, res, next) { 
     var pathname = url.parse(req.url).pathname; 
     if(pathname == '/exit') 
     req.logout(); 
     next(); 
    }); 
}); 

我用叫xmlhttprequest一個節點模塊中這樣定義創建HTTP請求。

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; 

然後在我的套接字的斷開事件我添加了以下幾行。

io.sockets.on('connection', function (socket) { 
socket.on('disconnect', function() { 
    console.log("|||||| DISCONNECTED ||||||"); 
    var xhr = new XMLHttpRequest();  
    xhr.open("GET", "http://localhost:3000/exit"); 
    xhr.send(); 
}); 
}); 

這不工作,用戶不退出時disconnect事件觸發。我可以在控制檯上看到此消息|||||| DISCONNECTED ||||||。在我的瀏覽器,但在回壓並刷新用戶註銷頁面Cannot GET /exit:另外,如果我在瀏覽器地址欄中輸入http://localhost:3000/exit,然後按回車鍵,我看到這條消息。

+0

什麼是它沒有顯示?你有什麼似乎應該工作。或者你有沒有試圖在服務器上實現任何東西? – jcolebrand 2012-08-06 17:53:33

+0

我不知道斷開連接事件中應該存在的代碼。 – Shekhar 2012-08-07 07:33:34

+0

我編輯了這個問題。請看一看! – Shekhar 2012-08-07 07:44:32

回答

0

這個代碼是沒有好。

app.use(function(req, res, next) { 
     var pathname = url.parse(req.url).pathname; 
     if(pathname == '/exit') 
     req.logout(); 
     //try adding this line, so that it doesn't just show the "can't retrieve" 
     res.end('<html><head>logged out</head><body>logged out</body></html>'); 
     next(); 
    }); 

編輯:

socket.on('disconnect', function() { 
    console.log("|||||| DISCONNECTED ||||||"); 
    var xhr = new XMLHttpRequest();  
    //this won't work, don't do this 
    xhr.open("GET", "http://localhost:3000/exit"); 
    xhr.send(); 
}); 

代替,這樣做:

socket.on('disconnect', function() { 
    console.log("|||||| DISCONNECTED ||||||"); 
    user.logout(); 
}); 

我認爲在這一點上做從網頁的重定向,退出,並有退出發送另一個重定向到另一頁。我就是這麼做的。

+0

不,這不是問題。問題是我不想在我的瀏覽器中輸入網址,或者點擊註銷按鈕將我註銷。當斷開連接事件發生時,我希望它發生。 在當前場景中,我無法通過發出HTTP請求來註銷用戶。只有在我的瀏覽器窗口中輸入相同的網址,然後按下回車鍵,我才能夠退出。我不想這樣做。 – Shekhar 2012-08-07 18:15:40

+0

順便說一句我試過你的方法。它給出了一個錯誤。 錯誤:發送後無法設置標題。 – Shekhar 2012-08-07 18:27:08

+0

哦,好的。另外,無法設置標題可能是一個問題,我把「結束」,我只是想表明,你在這一點上做得很好。 – jcolebrand 2012-08-07 18:49:28