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('/');//发表成功跳转到主页
});
});
一般情况下,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手法