gpt4 book ai didi

Node.js/Socket.io/Passport.js 注销问题

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:54 26 4
gpt4 key购买 nike

我正在使用Node.js创建一个网站( Express 框架)并使用 Passportjs用于身份验证。我用socket.io用于客户端和服务器之间的通信。我的网站显示哪些用户在线。我想要的是,当客户端关闭其选项卡或浏览器本身而不注销网站时,我希望用户在 'disconnect' 事件触发时从网站注销。代码片段应该类似于服务器端。

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 的 Node 模块,其定义如下来创建 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 事件触发时用户不会注销。我可以看到这条消息||||||控制台上已断开 ||||||。此外,如果我在浏览器地址栏中输入 http://localhost:3000/exit 然后按 Enter,我会看到以下消息:Cannot GET/exit 在我的浏览器中,但按回键并刷新页面时,用户会注销。

最佳答案

这段代码不好。

 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();
});

我建议此时从页面进行重定向,退出,并让退出发送另一个重定向到另一个页面。我就是这么做的。

关于Node.js/Socket.io/Passport.js 注销问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11831736/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com