【问题标题】:Meteor allow deny functions?流星允许拒绝功能?
【发布时间】:2014-02-11 06:00:57
【问题描述】:

在我的应用程序中,我使用了一个名为 Polls_Coll

的集合

这是我的允许函数

Polls_Coll.allow({
            insert:function(){
                    return true;
                    },
            update:function(userId, doc, fields, modifier){
                    return (doc.owner===userId);
                    },
            remove:function(){
                return true;
            }
        });

我在登录我的帐户后插入了一个文档

当我尝试从客户端更新该文档值时

var option_data=Polls_Coll.findOne({_id:this._id}).option2[0].pd;
            var u_name=Meteor.user().profile.name;
            Polls_Coll.update({_id:this._id,"option2.pd":option_data},{$push:{"option2.$.ids":u_name}});

它显示untrusted code may update using id only 的错误,但是当我尝试从服务器端插入它时它正在工作 这是我将文档插入集合的方式

Polls_Coll.insert({question: quest,
                    option1:[{pd:op1,ids:[]}],
                    option2:[{pd:op2,ids:[]}],
                    option3:[{pd:op3,ids:[]}],
                    option4:[{pd:op4,ids:[]}]
                    });

为什么值没有从客户端更新。

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

    来自文档中的this 部分:

    不受信任的代码包括客户端代码,例如事件处理程序和浏览器的 JavaScript 控制台。

    不受信任的代码一次只能修改一个文档,由其 _id 指定。

    所以,我相信,唯一允许的选择器是_id。您可以使用 $set 运算符获得相同的结果,例如:

    var poll = Polls_Coll.findOne({_id: this._id});
    poll.option2[0].ids.push(Meteor.user().profile.name);
    Polls_Coll.update({_id: this._id}, {$set: {option2: poll.option2}});
    

    【讨论】:

      【解决方案2】:

      Meteor 对受信任代码(在服务器上)的处理 update() 与对不受信任代码(在客户端)的处理不同。

      不受信任的代码一次只能修改一个文档,由其 _id 指定。 - 来自http://docs.meteor.com/#update

      update() 选择器内的任何其他标准都允许您通过尝试多个选择器来了解 db 对象中的内容,因此开发组已经消除了这种可能性。如果您需要在更新之前验证是否满足其他条件,请使用findOne() 进行检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-14
        • 2014-02-06
        • 2014-09-03
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        相关资源
        最近更新 更多