【问题标题】:Why is $http.get returning 304 error为什么 $http.get 返回 304 错误
【发布时间】:2017-01-30 17:39:30
【问题描述】:

我是 Angular 的新手,并且在使用始终有效的服务时遇到了麻烦,直到它没有。我的服务有以下调用。

this.getForms = function() {
    return $http.get("/forms").
    then(function(response) {
        return response;
    }, function(response) {
        alert("Error finding forms.");
    });
};

当页面刷新 (safari) 时触发 getForms,调用 $http.get,我的 Node.js/Express 服务器表单端点正确返回表单数据。

app.get("/forms", function (req, res) {
    Form.find({}, function (err, docs) {
        if (err) {
            server.handleError(res, err.message, "Failed to get forms.");
        } else {
            res.status(200).json(docs);
        }
    });
});

但是我得到一个 304 错误,而不是 JSON,这表明数据在缓存中可用。但是 304 响应头有一个空的数据字符串,所以它没有从缓存中返回任何数据。

我的问题是

1) 如果数据在缓存中可用,为什么它会调用我的服务器?

2) 如何告诉它不要缓存此调用,以便页面可以正确更新表单?

【问题讨论】:

    标签: javascript angularjs node.js caching safari


    【解决方案1】:

    编辑:看起来 Safari 可能存在潜在问题。也可以看看这个帖子。 NodeJS/express: Cache and 304 status code

    您可能误解了 304 状态码的含义。 304 不是错误;它只是意味着您从服务器请求的资源没有改变。响应意味着不包含数据,因为它希望客户端将其缓存在某处。

    例如,网络浏览器会尝试缓存图像,这样如果用户重新加载页面或稍后返回该页面,服务器就不必再次通过网络发送它。但是,浏览器需要一种方法来知道图像是否是最新的。如果服务器发送 304,浏览器知道它可以继续使用缓存中的副本。

    在您的情况下,如果您收到 304,您应该实施某种缓存以返回先前的响应。 或者,我相信您可以将这些标头添加到请求中以强制它返回数据

     Cache-Control: no-cache, no-store, must-revalidate
     Pragma: no-cache
     Expires: 0
    

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      相关资源
      最近更新 更多