在Localhost上实时更新数据但不在Live Server上更新(节点js + MongoDB)

时间:2014-11-20 21:41:49

标签: javascript angularjs node.js mongodb real-time

我正在尝试做什么:

将数据发送到节点,让节点将其保存在mongoDB中,并在完成后发送一个响应,说明它有效。然后通过节点从mongoDB中获取角度为http.get()的数据。

问题:

这一切都在我的本地机器上完美运行,但不在我的服务器上运行。在我的服务器上,我得到一个回复​​说数据已成功保存,我甚至可以直接在命令行中使用mongo cli检查数据库,我在那里看到数据。但它需要几次页面刷新,或者在最近的帖子实际显示之前大约30秒。

如果我有过去的多个帖子,并且我发了一个新帖子,Node会查询mongoDB并返回大约30秒前和之前的所有帖子,因此只显示最近保存的数据。同样,在我的本地机器上不是这种情况,我立即得到所有数据。

所以,我只是想知道是否有人经历过这个或知道为什么会发生这种情况?为什么mongo CLI会立即向我显示最新数据,而通过angular http向节点路由发出请求会在保存数据后大约30-60秒返回旧结果?是否可能节点或mongo正在缓存结果并花费一些时间来更新缓存?

我的设置:

本地计算机

  • OSX - 10.10
  • 节点 - v0.10.33
  • MongoDB - 2.6.4

服务器:

  • CentOS - 6.5版(最终版)
  • 节点 - v0.10.33
  • MongoDB - 2.6.4

node.js在mongoDB中保存数据:

var order = {
  size: safePostData.size,
  toppings: safePostData.toppings,
  //etc...
};
db.pizza.update({
  authToken: <user authentication goes here>
},
{
  $addToSet: {
    orders: order
  }
}, function(err, updated) {
  if (err || !posted) {
    res.send({status: false, stackTrace: 'placing order', msg: 'order failed'});
  } else {
    res.send({status: true, stackTrace: 'placing order', msg: 'order was placed'});
  }
});

angular.js从服务器获取数据:

angular.module('fakePizzaExample')
  .factory('userData', userData);

userData.$inject = ['$http'];
function userData(http) {
  var homeData = {};

  var refreshData = function(callback) {
    http.get('<URL TO ROUTE ON NODE SERVER>')
      .success(function (data, status, headers, config) {
        homeData = data;

        if (typeof callback !== 'undefined') {
          callback(data);
        }
      })
      .error(function (data, status, headers, config) {
        console.log(data);
      });
  };

  refreshData();

  return {
    get: function () {
      return homeData;
    },
    refresh: function(callback) {
      return refreshData(callback);
    }
  };
}

node.js将数据发送回angular:

db.users.findOne({
  authToken: <user authentication goes here>
}, function(err, found) {
  if (err || !found) {
    res.send( { status: false, stackTrace: 'find user', msg: 'No user found' } );
  } else {
    userData = found;
    res.send({ status: true, stackTrace: 'find user', msg: userData });
  }
});

更新

我有一个朋友登录到服务器,看看他是否有相同的延迟结果,他没有。显然,当使用实时服务器时,它正如预期的那样工作。至少可以说这真让我感到困惑......

更新2:

根据@ Tracker1的建议,我尝试使用POST而不是GET,我也尝试使用缓存破坏查询字符串参数,我仔细检查了我的mongoDB配置,我没有使用复制或延迟写入。不幸的是,就像我说的那样,它在localhost和某些计算机/连接上工作正常,但在其他计算机/连接上却没有。

1 个答案:

答案 0 :(得分:1)

最有可能的是,您可能正在获得GET请求的缓存版本...如果您必须拥有最新鲜的数据,请使用缓存清除查询字符串参数,或使用其他方法({{1你应该适当地设置缓存头。

此外,如果您在MongoDB中使用复制或通过配置使用延迟写入,则后续请求可能会收到陈旧数据。