Node.js ( Express Framework) を使用して Web サイトを作成しており、認証にPassportjsを使用しています。クライアントとサーバー間の通信にはsocket.ioを使用します。私のウェブサイトには、オンラインのユーザーが表示されます。私が望むのは、クライアントがウェブサイトからログアウトせずに自分のタブまたはブラウザ自体を閉じたときに、'disconnect'
イベントが発生したときにユーザーがウェブサイトからログアウトされるようにすることだけです。コード フラグメントはserver
横のように見えるはずです。
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 ||||||
コンソールにこのメッセージが表示されます。またhttp://localhost:3000/exit
、ブラウザのアドレス バーに入力して EnterCannot GET /exit
キーを押すと、次のメッセージが表示されます。