2014-02-11 176 views
0

在我的應用我使用的是被稱爲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:[]}] 
        }); 

爲什麼值不是從客戶端更新。

回答

0

從在文檔this部分:

不可信代碼包括客戶端代碼,例如事件處理程序和瀏覽器的JavaScript控制檯。

不可信的代碼一次只能修改一個文檔,由其_id指定。

所以,我相信,唯一允許的選擇是_id

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

流星處理update() differenty受信任的代碼(在服務器上)比它不受信任的代碼(客戶端):你可以用$set運營商的東西,如達到同樣的效果。

不受信任的代碼一次只能修改一個文檔,由其_id指定。 - 從http://docs.meteor.com/#update

update()選擇內部的任何其他標準將讓你瞭解什麼是在數據庫對象通過嘗試多種選擇,所以開發小組已經消除了這種可能性。如果您需要在更新之前驗證是否符合其他條件,請使用findOne()進行檢查。