在本地主机上实时更新数据,但不在实时服务器上更新(Node js + MongoDB)

Data Updating In Real Time On Localhost But Not On Live Server (Node js + MongoDB)

本文关键字:更新 Node js 服务器 MongoDB 主机 实时更新 数据 实时      更新时间:2023-09-26

我想做什么:

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

问题:

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

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

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

我的设置:

本地计算机

  • OSX - 10.10
  • 节点 - v0.10.33
  • 蒙戈数据库 - 2.6.4

服务器:

  • CentOS - 版本 6.5 (最终版)
  • 节点 - v0.10.33
  • 蒙戈数据库 - 2.6.4

节点.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'});
  }
});

角度.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);
    }
  };
}

节点.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 配置,我没有使用复制或延迟写入。不幸的是,就像我说的,它在本地主机和某些计算机/连接上运行良好,但在其他计算机上无法正常工作。

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

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