为什么$ http.get返回304错误

时间:2017-01-30 17:39:31

标签: javascript angularjs node.js caching safari

我是一个刚接触过角色的新手,并且遇到了一项始终有效的服务,直到它没有成功。我的服务有以下电话。

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);
        }
    });
});

但是我没有收到JSON,而是收到304错误,这表示数据在缓存中可用。但304响应头有一个空数据字符串,因此它不会从缓存中返回任何数据。

我的问题是

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

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

1 个答案:

答案 0 :(得分:3)

编辑:看起来Safari可能存在潜在问题。也请看这篇文章。 NodeJS/express: Cache and 304 status code

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

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

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

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