【问题标题】:Mongoose doesn't update db entriesMongoose 不更新数据库条目
【发布时间】:2012-06-28 13:19:26
【问题描述】:

我使用 express.js 和 mongoose 作为 ODM。

我知道当其他服务对 mongoDB 进行更新时,mongoose 无法识别这一点。所以仍然显示数据库的旧状态。

我认为这是因为 mongoose 在创建、更新新文档后使用回调来获取更新,但是当另一个服务与 mongoDB 交互时,此回调不会被触发。

那么我怎么能手动说猫鼬照顾不是自己创建的文档呢?

routes/user.js

var User = require('../models/user.js')
, requirements = { enabled: true, expired: false, locked: false };

exports.list = function(req, res){
    User.find(requirements, function(err, users){
        res.send(users);
    });
};

app.js

app.get('/users', user.list);

当我现在使用 curl 或浏览器访问 /users 时,我得到了 mongodb 中所有用户的数组。直到现在都是这样。现在我在我的 PHP 环境中注册了一个新用户。当我现在再次请求 /users 时,我仍然得到与以前相同的数组,而没有通过 php 创建的用户!

当我现在重新启动节点服务并再次请求 /users 时,由 php 创建的用户就在那里......

【问题讨论】:

  • 您关于 Mongoose API 的断言并不总是反映数据库的当前状态是不正确的。当然,先前查询的结果不会反映自执行查询以来对数据库所做的任何外部更改,但任何新的find 查询肯定会。您关心的具体案例是什么?
  • 听起来问题可能是 express.js 中的视图缓存。你可以试试app.disable('view cache'); 看看是不是这样。
  • 就是这样:)。使用 node.js 作为通信 API 时禁用视图缓存是默认行为吗?

标签: node.js mongodb express mongoose


【解决方案1】:

express.js 框架包括默认为生产站点启用的视图缓存)。我怀疑你的结果被缓存了,因为你包含了一个函数引用(user.list)而不是一个闭包,例如:

app.get('/users', function(req, res){
    User.find(requirements, function(err, users){
        res.send(users);
    });
});

视图缓存是一个全局设置,应该只缓存视图模板,而不是视图的内容。有人请求more granular caching,但看起来这不是必需的。

您可以尝试使用以下方法禁用视图缓存:

app.disable('view cache');

Express.js Google Group 是搜索或要求澄清的好资源。

【讨论】:

    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2017-12-04
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多