【问题标题】:Data Updating In Real Time On Localhost But Not On Live Server (Node js + MongoDB)在本地主机上实时更新数据,但不在实时服务器上(Node js + MongoDB)
【发布时间】:2015-01-18 22:25:28
【问题描述】:

我想要做什么:

向节点发送数据,让节点将其保存在 mongoDB 中,完成后 - 发送回复说它有效。然后通过节点从 mongoDB 中使用 Angular 的 http.get() 获取该数据。

问题:

这一切都在我的本地机器上完美运行,但不是在我的服务器上。在我的服务器上,我收到一条回复说数据已成功保存,我什至可以使用 mongo cli 直接在命令行中检查数据库,我在那里看到了数据。但是需要刷新几次页面,或者大约 30 秒才能真正显示最新的帖子。

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

所以,我只是想知道是否有人经历过这种情况或知道为什么会发生这种情况?为什么 mongo CLI 会立即向我显示最新数据,而通过 angular http 向节点路由发出请求会在数据保存后大约 30-60 秒返回旧结果?是否有可能 node 或 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 和某些计算机/连接上运行良好,但在其他计算机/连接上运行良好。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 设置缓存头并尝试 POST 方法并没有改变任何东西,我没有使用复制或延迟写入... :( 不过这些都是好主意。
    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多