【已解决】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('/');//发表成功跳转到主页
    });
    
  });

4 回复

标题:【已解决】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('/'); // 发表成功跳转到主页
      });
    });
  });
});

在这个解决方案中,我们做了以下几件事:

  1. 当用户发布文章时,通过User.talkcount方法将用户的文章数量增加1。
  2. User.talkcount方法执行完毕后,再次调用User.get方法获取更新后的用户信息。
  3. 将更新后的用户信息存入session,并调用req.session.save()方法来保存session。
  4. 最后,重定向到主页并显示发布成功的消息。

这样,每次用户发布文章后,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中的变更,这样当用户刷新或导航回同一页面时,能看到最新的数据。

这样做可以避免用户必须退出登录才能看到最新更新的问题。

回到顶部