【已解决】session必须退出才能更新吗?(session及时更新前台)
发布于 10 年前 作者 heixiaoshan 13056 次浏览 最后一次编辑是 8 年前

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('/');//发表成功跳转到主页
    });
    
  });
2 回复

一般情况下,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手法

回到顶部