【发布时间】:2023-03-09 08:44:01
【问题描述】:
我正在使用Node.js(Express 框架)创建一个网站,并使用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,然后按回车,我会在浏览器中看到此消息:Cannot GET /exit,但在按下返回并刷新页面时,用户已注销。
【问题讨论】:
-
它没有显示什么?你所拥有的似乎应该可以工作。或者你还没有尝试在服务器上实现任何东西?
-
我不知道断开连接事件中应该存在的代码。
-
我编辑了这个问题。请看一看!
标签: node.js socket.io passport.js