如何保存会话

时间:2017-02-27 11:15:59

标签: node.js express ejs

我在这里创建了一个函数:

router.get('/restful',function(req,res,next){
  var resultArray=[];
  mongo.connect(url,function(err,db){
    assert.equal(null,err);
    var cursor=db.collection('users').find();
    cursor.forEach(function(doc,err){
      assert.equal(null,err);
      resultArray.push(doc);
      req.session.resultArray=resultArray;
    },function(){
      db.close();
      res.render('restful',{items:resultArray});
          });

});
});

我创建了一个方法/ restful。 "宁静"是一个页面。

我想要的只是当我加载此页面时,resultArray会显示,但在第一次加载时不会显示。

我们第二次导航后显示它。所以没有检索到数据。

我该如何解决这个问题?

请帮我找到解决方案。

1 个答案:

答案 0 :(得分:0)

我不相信这是因为会话在node.js中的工作方式,但您可能需要参考:https://stormpath.com/blog/everything-you-ever-wanted-to-know-about-node-dot-js-sessions

我会将req.session.resultArray移出forEach,因为当您已经为其值构建数组时多次覆盖会话没有任何好处,您可以稍后再设置它在你构建了整个阵列之后。

这不是一个需要调用重定向来查看新会话数据的问题,因为我们甚至在技术上都没有访问cookie或会话(但是),我们正在使用res.render()使变量items在我们的视图中公开resultArray的内部变量。虽然如果你想使用它,你可以使用res.redirect('/restful')来调用已经初始化数据的重定向。

我会看这样的事情

router.get('/restful', function( req, res, next ) {
  var resultArray = [];
  mongo.connect(url, function( err, db ) {
    assert.equal(null, err);
    var cursor = db.collection('users').find();
    cursor.forEach(function(doc, err){
      assert.equal(null, err);
      resultArray.push(doc);
    });
    db.close();
  });
  req.session.resultArray = resultArray;
  // this should contain your
  // session data
  console.log(resultArray);
  res.render('restful', {items:resultArray});  
  next();
});

但是我想注意,您遇到的问题不在于会话数据无法保存或可访问,而是在res.render()resultArray未出现resultArray要建立,因为你只是将这个变量暴露给你的视图。

我会记录你的<ion-footer-bar keyboard-attach class="bar-stable item-input-inset" style="margin-bottom: 50px; height: 60px; background-color: white;"> <input style="width: 100%;" type="url" placeholder="{{'text_input' | translate}}" ng-model="post.new"/> </ion-footer-bar> ,答案应该清楚了。