gpt4 book ai didi

session - Express - socket.io - 阅读 session

转载 作者:太空宇宙 更新时间:2023-11-03 22:56:24 25 4
gpt4 key购买 nike

我使用 Express 和 socket.io。

当您使用特快专递创建 session 时。单击按钮并使用 Ajax 和 POST 方法(登录)保存 session 。

 app.post('/login', function(req, res){
req.session.loginid = req.body.lgnid;
});

在socket.io中它无法读取。

我的源代码:

var express = require('express');
var app = express.createServer();
var io = require('socket.io').listen(app);
var MemoryStore = express.session.MemoryStore;
var sessionStore = new MemoryStore();
var parseCookie = require('connect').utils.parseCookie;
var Session = require('connect').middleware.session.Session;
var stylus = require('stylus');
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({store: sessionStore
, secret: 'secret'
, key: 'express.sid'}));

app.use(stylus.middleware({ src: __dirname + '/public', compile: compile }))
app.use(express.static(__dirname + '/public'));
app.set('views', __dirname);

// disable layout
app.set("view options", {layout: false});

// make a custom html template
app.register('.html', {
compile: function(str, options){
return function(locals){
return str;
};
}
});

function compile (str, path) {
return stylus(str)
.set('filename', path)
.use(nib());
};

var Session = require('connect').middleware.session.Session;
sio.set('authorization', function (data, accept) {
if (data.headers.cookie) {
data.cookie = parseCookie(data.headers.cookie);
data.sessionID = data.cookie['express.sid'];
// save the session store to the data object
// (as required by the Session constructor)
data.sessionStore = sessionStore;
sessionStore.get(data.sessionID, function (err, session) {
if (err || !session) {
accept('Error', false);
} else {
// create a session object, passing data as request and our
// just acquired session data
data.session = new Session(data, session);
accept(null, true);
}
});
} else {
return accept('No cookie transmitted.', false);
}
});

如何从sessionStore加载和保存数据?

io.sockets.on('connection', function (socket) {

var hs = socket.handshake;
console.log('Session : ' + hs.session.loginid + '); //Session : undefined

});

最佳答案

实际实现这一目标的推荐方法(至少根据我的经验)是放弃 sessionStore.get 函数并使用 sessionStore.load - 区别在于通过加载,回调会被赋予一个 session 实例,而不必自己创建一个。区别只是简单地获取您的代码片段:

sessionStore.get(data.sessionID, function (err, session) {
if (err || !session) {
accept('Error', false);
} else {
// create a session object, passing data as request and our
// just acquired session data
data.session = new Session(data, session);
accept(null, true);
}
});

并将其更改为:

sessionStore.load(data.sessionID, function(err, session) {
if (err || !session) {
accept("Error", false);
} else {
data.session = session;
accept(null, true);
}
});

从那里,您应该能够在尝试时访问 session ,例如 socket.handshake.session,但是在处理 session 时,如果您在套接字事件中进行更改,则自己手动保存 session 。如果添加/删除内容,则必须:session.save([callback])

我意识到这并不是一个很好的答案,因为我告诉你大致做你已经做的事情,但这对我来说现在使用 Express 2.5.8 和 Socket.IO 0.9.6

关于session - Express - socket.io - 阅读 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8863644/

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