Node.js / Expressjs不会清除会话

时间:2015-01-10 09:35:23

标签: javascript angularjs node.js session express

一些用户通过 Angularjs / $ http.get()加载应用程序,然后向下滚动加载更多(无限滚动)。

该页面还有一些位置过滤器,因此用户可以选择其他国家/地区和城市,仅查看该位置的用户。

控制器是:

$scope.country;
$scope.city;
$scope.users = [];
$scope.busy = false;
$scope.destroy = null;

$scope.nextPage = function() {
  if ($scope.busy) return;
  $scope.busy = true;

  $http.get('/users', {
    params: {
      destroy: $scope.destroy,
      country: $scope.country,
      city: $scope.city
    }
  }).success(function(res) {
    var users = res.users;
    for (var i = 0; i < users.length; i++) {
      $scope.users.push(users[i]);
    }
    $scope.busy = false;
    $scope.destroy = null;
  }).error(function() {
    alertify.error('Error loading Escorts');
  });
};
  • 在地点变更时,我致电返回新国家和城市的服务;
  • 所以我设置了这些信息并清空了用户数组;
  • 我还设置了$ scope.destroy来告诉服务器清除会话;
  • 在会话中,我存储已加载到页面中的用户的ID以避免重复。

这是在同一个控制器中处理位置更改的代码:

$scope.$on('handleLocationBroadcast', function() {
  $scope.country = SharedLocationService.country;
  $scope.city = SharedLocationService.city;
  $scope.destroy = 'destroy';
  $scope.users = [];
  $scope.nextPage();
});

服务器端我使用Expressjs / Node并且控制器非常简单:

exports.getUsers = function(req, res) {
    // If parameter destroy is 'destroy' then clear the session.skip.
    if (req.query.destroy === 'destroy') req.session.skip = [];

    // set skip with session or empty array (need for the first call)
    var skip = req.session.skip || [];

    // set locations (I use to store also the location in a session for future calls
    var country = req.query.country || req.session.country || { $ne: '' };
    var city = req.query.city || req.session.city || { $ne: '' };

    // Get users
    User.find({ '_id' : { '$nin': skip }})
    .where( { 'location.country' : country, 'location.city' : city } )
    .sort({ _id: -1 })
    .limit(15)
    .exec(function(err, users) {

    if (err) res.json({ 'msg': 'Error loading users' });

    for (var i = 0; i < users.length; i++) {
        skip.push(users[i]._id);
    }

    req.session.skip = skip;

    res.json({
      users: users
    });

  });
};

在我改变位置之前,一切似乎都非常顺利。

当我更改位置时,似乎会话被正确清除,但只要我向下滚动以呼叫其他用户,我就会看到会话尚未清除,导致用户负载严重不足。

因此,如果我浏览来自英国所有城市的用户,并且我选择仅在更改位置切换到伦敦,则清空用户阵列,正确加载15个用户,但在向下滚动时,它不会加载在上一个会话中出现的并且查看会话日志的用户已经收到了整个列表。

我该如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:0)

好吧,我自己解决了这个问题,在再次致电POST

之前执行$scope.nextPage();请求清除更改位置的会话

基本上代码如下:

$scope.$on('handleLocationBroadcast', function() {
  $scope.country = SharedLocationService.country;
  $scope.city = SharedLocationService.city;
  $scope.users = [];

  $http({
    url: '/destroy',
    method: 'POST',
    data: { destroy: true }
  }).then(function(res) {
    $scope.nextPage();
  }, function() {
    alertify.error('Error loading users');
  });
}

再向服务器发出一个请求,是的,但它现在解决了问题。如果有一个更好的方式,我会很高兴看到它并学到新的东西。