【问题标题】:Express Mongoose automated caching?Express Mongoose 自动缓存?
【发布时间】:2018-04-19 19:15:26
【问题描述】:

我今天得到的一个奇怪的观察是这样的:

我们有一个使用 NodeJSexpressmongoose 制作的 REST API。 有一个 GET 端点 /api/cars 相当简单地返回 Car 模型中的汽车列表:

app.get('/cars', (req, res, next) => {
    Car.find()
        .exec()
        .then(cars => {
            res.status(200).send(cars);
        }, error => {
            next(error);
        });
});

有趣的是,第二次通过浏览器访问端点返回状态码304,这意味着它确实缓存了它(修改数据库中的列表将状态更改回200)。但是,我不太明白它发生在哪里以及是谁做的。 有趣的是,如果我手动将列表缓存在 Redis 数据库中并从那里检索它,即使数据根本没有修改,响应总是200。那么它是 mongoose 的一部分吗?

我的意思是我很欣赏自动缓存,但我想知道它是如何发生的。 我们没有为 express 使用特定的缓存模块。

【问题讨论】:

    标签: node.js express caching mongoose


    【解决方案1】:

    304 表示资源未被修改

    表示资源自请求头 If-Modified-Since 或 If-None-Match 指定的版本以来没有被修改。在这种情况下,无需重新传输资源,因为客户端仍有先前下载的副本

    (https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/304)

    另见 RFC7232 https://www.rfc-editor.org/rfc/rfc7232

    这是浏览器缓存,之前发送的标头没有被修改。当您手动编辑数据库时,它们将被编辑...因此您不会获得浏览器缓存副本,但您会下载新副本。

    【讨论】:

    • 那么,如果我从 Redis 而不是 mongoDB 检索未修改的数据,为什么我得不到相同的结果?
    • 这也取决于标头/配置。我可以猜到:Redis 是否发送“Last-Modified”标头?是其他配置发送吗?编辑:如果是,内容是什么?
    猜你喜欢
    • 2014-03-16
    • 2012-01-12
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多