【已解决】Nodejs中session必须退出才能更新吗?(session及时更新前台,Nodejs相关)
【已解决】Nodejs中session必须退出才能更新吗?(session及时更新前台,Nodejs相关)
node中怎么更新session中的值? 常规的node+express 3.4 +mongo 例如,我发一篇文章count就加1,但是页面无法及时显示。我想要页面同步显示,现在必须退出重新登录才行。 user.js 用到的方法,代码如下:
//用户文章count递增
User.talkcount = function(name, callback) {
//打开数据库
mongodb.open(function (err, db) {
if (err) {
return callback(err);//错误,返回 err 信息
}
//读取 users 集合
db.collection('users', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);//错误,返回 err 信息
}
//更新用户名(name键)值为 name 一个文档的count值
collection.update(
{name: name},
{$inc: {"count": 1}},
function (err, user) {
mongodb.close();
if (err) {
return callback(err);//失败!返回 err
}
console.log(‘username:’+user.name+‘,usernames:’+user.names+‘,usercount:’+user.count);
** username:undefined,usernames:undefined,usercount:undefineduser.count:undefined **
callback(null, user);//成功!返回查询的用户信息
});
});
});
};
console.log("username:"+user.name+",usernames:"+user.names+",usercount:"+user.count’)
结果 :username:undefined,usernames:undefined,usercount:undefined ,user.count:undefined index.js 调用代码如下:
app.post('/post', checkLogin);
app.post('/post', function (req, res) {
var currentUser = req.session.user,
tags = [req.body.tag1, req.body.tag2, req.body.tag3],
post = new Post(currentUser.name, currentUser.names,currentUser.head,req.body.title, tags, req.body.post);
post.save(function (err) {
if (err) {
req.flash('error', err);
return res.redirect('/');
}
User.talkcount(currentUser.name,function(err,user){
if(err){
req.flash('error', err);
return res.redirect('/');
}
console.log("user.count:"+user.count);
});
req.flash('success', '发布成功!');
res.redirect('/');//发表成功跳转到主页
});
});
###解决,附上解决方案,不完美。
app.post('/post', checkLogin);
app.post('/post', function (req, res) {
var currentUser = req.session.user,
tags = [req.body.tag1, req.body.tag2, req.body.tag3],
post = new Post(currentUser.name, currentUser.names,currentUser.head,req.body.title, tags, req.body.post);
post.save(function (err) { //保存文章
if (err) {
req.flash('error', err);
return res.redirect('/');
}
User.talkcount(currentUser.name,function(err,user){ //保存文章成功后count+1
if(err){
req.flash('error', err);
return res.redirect('/');
}
User.get(currentUser.name,function(err,user){//获得当前用户的信息
if(err){
req.flash('error', err);
return res.redirect('/');
}
req.session.user=user;//用户信息存入 session
req.session.save();//关键是这个,要调用前台才会实时更新
});
});
req.flash('success', '发布成功!');
res.redirect('/');//发表成功跳转到主页
});
});
标题:【已解决】Nodejs中session必须退出才能更新吗?(session及时更新前台,Nodejs相关)
内容: 在Node.js中使用Express框架时,经常需要处理用户的会话(session)数据。假设你有一个需求,每当用户发布一篇文章时,其发布的文章数量(count)需要增加,并且页面需要实时更新以反映最新的count值。
首先,我们需要确保每次用户发布文章后,session中的用户信息能够被正确更新。以下是一个完整的解决方案:
// 用户文章count递增
User.talkcount = function(name, callback) {
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
db.collection('users', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
collection.update(
{name: name},
{$inc: {"count": 1}},
function (err, result) {
mongodb.close();
if (err) {
return callback(err);
}
callback(null, result);
}
);
});
});
};
app.post('/post', checkLogin, function (req, res) {
var currentUser = req.session.user;
var tags = [req.body.tag1, req.body.tag2, req.body.tag3];
var post = new Post(currentUser.name, currentUser.names, currentUser.head, req.body.title, tags, req.body.post);
post.save(function (err) {
if (err) {
req.flash('error', err);
return res.redirect('/');
}
User.talkcount(currentUser.name, function (err, user) {
if (err) {
req.flash('error', err);
return res.redirect('/');
}
User.get(currentUser.name, function (err, updatedUser) {
if (err) {
req.flash('error', err);
return res.redirect('/');
}
req.session.user = updatedUser; // 更新session中的用户信息
req.session.save(); // 保存session
req.flash('success', '发布成功!');
res.redirect('/'); // 发表成功跳转到主页
});
});
});
});
在这个解决方案中,我们做了以下几件事:
- 当用户发布文章时,通过
User.talkcount
方法将用户的文章数量增加1。 - 在
User.talkcount
方法执行完毕后,再次调用User.get
方法获取更新后的用户信息。 - 将更新后的用户信息存入session,并调用
req.session.save()
方法来保存session。 - 最后,重定向到主页并显示发布成功的消息。
这样,每次用户发布文章后,session中的用户信息会被立即更新,并且页面上的用户信息也会实时反映最新的count值。
一般情况下,session更改要使用req.session.save()等方法 因为在写express.session()中间件的时候 参数有项store: new MongoStore这项啊,假如没写默认是MemoryStore 就是默认session值保存在服务器内存中结构类似于{sid: { 通过req.session设置的属性 }},每一个路由请求后,响应代码前,首先express.cookieParser()这个中间件将cookie中的sid解析出来,然后到内存中的session store中去找,如果找到了就创建req.session并且把刚才得到的对于赋予req.session,这也就是session这个中间件是依赖于cookieParser()中间件然后构建出req.session这个对象的由来 也可以得到session值的改变必须是在res.end响应后或者使用req.session.save()这种方法来变更将数据保存到session store中
多看看http原理是真的, 本来就没有session这么个东西, 只有coockie和各种hack手法
在Node.js中使用Express框架管理Session时,如果你希望在更新用户的某个属性(如count
)后,立即在前端页面显示最新的数据,可以通过更新Session中的用户信息来实现。你已经在代码中尝试了这种方法,但可能存在一些细节上的问题。
在你的解决方案中,关键在于确保更新后的用户信息能够及时反映到Session中,并且需要调用req.session.save()
方法以确保更改被持久化并同步到客户端。
以下是优化后的解决方案示例代码:
app.post('/post', checkLogin, function (req, res) {
var currentUser = req.session.user;
var tags = [req.body.tag1, req.body.tag2, req.body.tag3];
var post = new Post(currentUser.name, currentUser.names, currentUser.head, req.body.title, tags, req.body.post);
post.save(function (err) {
if (err) {
req.flash('error', err);
return res.redirect('/');
}
User.talkcount(currentUser.name, function (err, updatedCount) {
if (err) {
req.flash('error', err);
return res.redirect('/');
}
// 更新用户的 count 属性
currentUser.count = updatedCount.count;
// 更新 Session 中的用户信息
req.session.user = currentUser;
// 保存 Session 变更
req.session.save(function (err) {
if (err) {
req.flash('error', err);
return res.redirect('/');
}
req.flash('success', '发布成功!');
res.redirect('/'); // 发表成功跳转到主页
});
});
});
});
关键点解释
- 更新用户信息:首先,我们在数据库中更新用户的
count
属性,并获取更新后的用户信息。 - 更新Session中的用户信息:然后,将更新后的用户信息存储到
req.session.user
中,确保新的信息能被传递到客户端。 - 保存Session变更:最后,通过调用
req.session.save()
方法来保存Session中的变更,这样当用户刷新或导航回同一页面时,能看到最新的数据。
这样做可以避免用户必须退出登录才能看到最新更新的问题。