【问题标题】:Meteor update mongodb from client sideMeteor 从客户端更新 mongodb
【发布时间】:2015-07-29 20:07:55
【问题描述】:

我使用 Meteor 构建了一个应用程序,我很惊讶我可以从客户端更新我的 Meteor.user() 集合。

在我的 collections.js 文件中,我有:

Meteor.users.allow({
update: function(userId, doc) {
    return false;
}
});

我导航到一个页面,只有 isAdmin: true 的用户可以访问并在我的客户端控制台中输入:

Meteor.users.update({_id: 'adsfasdf'}, {$set: {isAdmin: true}});

紧接着,管理页面加载。

控制台输出是:

Meteor.users.update({_id: 'adsfasdf'}, {$set: {isAdmin: true}}); 1 debug.js:41 update failed: Access denied

你知道为什么会这样吗?

谢谢!

【问题讨论】:

    标签: javascript mongodb meteor permissions


    【解决方案1】:

    当您更新 Mongo 集合客户端时。更新首先发生在客户端 minimongo 集合上。然后 autorun 重新运行,并带有新的 client-side 更改。之后,更改将通过 DDP 推送到服务器。这是你得到错误的地方。错误发生后,autorun 不会重新运行。

    所以基本上你是依靠客户端数据来决定是否呈现管理页面。

    【讨论】:

    • 感谢您的回答。我的管理员控制器会检查用户是否是管理员 - 这是否意味着控制器也使用客户端数据?这是我的管理员控制器:onBeforeAction: function () { var currUser = Meteor.users.findOne(Meteor.userId()); if(currUser) { if (!currUser.isAdmin) { console.log(""); } else { this.next(); } } }
    • 当您使用iron-router 时,您通常会将所有这些内容放在client/routes.js 或其他东西中。这意味着client-side 路由的代码在客户端上运行。所以答案是是的
    • 如果我在 routes.js 中检查 isAdmin 属性,它还会使用客户端数据吗?谢谢
    • 是的,在客户端做这些事情(这也意味着来自客户端的数据)继承了 Iron-router 的架构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 2021-02-02
    • 2012-05-04
    • 2015-08-05
    相关资源
    最近更新 更多