Node.js 如何通过socket.io对象访问express.session.MemoryStore?
我在登录函数中执行此操作Node.js 如何通过socket.io对象访问express.session.MemoryStore?,node.js,sockets,session,express,Node.js,Sockets,Session,Express,我在登录函数中执行此操作 app.post('/teacherlogin', function(request, response) { var username = request.body.username; var password = request.body.password; con.query('SELECT t_id from login_teacher where username="'+username+'" and password="'+passw
app.post('/teacherlogin', function(request, response) {
var username = request.body.username;
var password = request.body.password;
con.query('SELECT t_id from login_teacher where username="'+username+'" and password="'+password+'"',function(err,results){
if(results.length > 0) {
request.session.regenerate(function(){
request.session.user = username;
request.session.type = 'teacher';
request.session.id = results[0].t_id;
response.redirect('/teacherhome');
});
} else {
response.redirect('teacherlogin');
}
});
});
现在,我想将存储的“id”和“type”发送到会话对象。我该怎么做?我读过书,但由于缺乏经验,我在使用上面临困难。我在代码中使用了它
var MemoryStore = express.session.MemoryStore;
var sessionStore = new MemoryStore();
app.use(express.bodyParser());
app.use(express.cookieParser('secret text'));
app.use(express.session({
store: sessionStore,
secret: 'secret',
key: 'express.sid'}
));
及
会话对象中没有任何内容。我试图记录sessionStore的内容,但它似乎是空的!这是否意味着我存储在会话中的信息没有存储在会话存储中?如果是,我应该如何将其存储在那里?如果它存储在那里,为什么sessionStore.get函数不能找到它 您必须使用数据库存储express会话,然后解析socket.io定义中的cookie数据,并使用获得的信息从数据库中获取会话信息,下面是一个完整的示例:
您还可以使用从cookie解析的会话ID,将用户加入一个带有会话名称的“聊天室”。我不确定您是否仍在处理此问题,但您可以仅使用MemoryStore访问会话数据。毕竟,如果它不起作用,Express还会怎么使用它呢?:) 演示MemoryStore工作的简单方法如下:
var express = require("express")
, app = express()
, sessionStore = new express.session.MemoryStore();
// middleware
app.use(express.cookieParser());
app.use(express.session({store: sessionStore, secret: "mysecret"}));
// any endpoint sets a cookie
app.get("/", function(req,res) {
res.send('ok');
});
// This endpoint reveals it
app.get("/session", function(req, res){
sessionStore.get(req.sessionID, function(err, data) {
res.send({err: err, data:data});
});
});
app.listen(3000);
点击/
,然后点击/session
,会得到以下响应:
{
"err": null,
"data": {
"cookie": {
"originalMaxAge": null,
"expires": null,
"httpOnly": true,
"path": "/"
}
}
}
我怀疑您的问题可能是如何从套接字获取sessionID,但从MemoryStore提取会话是绝对可能的。另外,请记住,重新启动Express server会破坏您的所有会话,因此每次重新启动后您都需要一个新的cookie。是否需要使用DB存储会话,我已经创建了一个MemoryStore var MemoryStore=Express.session.MemoryStore;var sessionStore=newmemorystore();它不应该保存会话数据吗?@newbie
MemoryStore
不是为生产环境设计的。建议使用内存中的数据库存储(如redis store)来实现这一点。请参阅Invoking express.session.MemoryStore()已被弃用并抛出:“错误:大多数中间件(如会话)不再与express捆绑,必须单独安装。请参阅。”@giladmayani在3年前写这篇文章时,会话仍然捆绑在express中。如果您使用的是较新的版本,请尝试require('express-session')。MemoryStore()
只是为了强调一点-因为我被它抓住了-记住在从MemoryStore()
类创建变量时使用new
。不这样做不会生成错误,但意味着当您设置store选项时,会话将忽略该错误,并且您的变量将为空<代码>常量表达式=要求('express');const session=require('express-session');const sessionMemoryStore=新建会话.MemoryStore();var-app=express();使用(会话({secret:'abc',store:sessionMemoryStore,resave:false,saveUninitialized:false,cookie:{maxAge:30000}))代码>
{
"err": null,
"data": {
"cookie": {
"originalMaxAge": null,
"expires": null,
"httpOnly": true,
"path": "/"
}
}
}