2016-01-20 60 views
3

後掛起過我有這樣的幫手:流星用戶幫手更新

agreed: function(){ 
     if (Meteor.users.findOne({_id: Meteor.userId(), profile: {agreedTermsOfUse: 'true'}})) 
      return true; 
    } 

在網頁,我檢查我有這樣的:

{{#unless agreed}} 
     agree form 
{{else}} 
    Create item form. 
    {{list of item}} 
{{/unless}} 

到目前爲止,一切進展順利。用戶註冊,然後他可以創建一個項目,並在項目列表上呈現。

現在,我添加了另一個Meteor.call,在客戶端獲得成功回調時,創建項目,它將項目ID添加到用戶的profile.hasItems中。

然後,在獲得該方法的成功後,「除非」返回false,並且我必須再次提交同意。

我錯過了什麼?謝謝。

"submit .create_restaurant": function (event) { 
    event.preventDefault(); 
    var text = event.target.create_restaurant.value; 
    Meteor.call('CreateRest', Meteor.userId(), text, function(error, result){ 
     if(error){ 

     }else{ 
       console.log(result, Meteor.userId()); 
       Meteor.call('userRestaurants', result, Meteor.userId(), function (error, result) { 

        if (error) { 
         alert(123); 
        } else { 
         console.log(result); 
        } 

       }) 

     } 
    } 
    ); 
    event.target.create_restaurant.value = ""; 
} 

方法:

'CreateRest': function(user_id, title) { 
    check(title, String); 
    check(user_id, String); 
    return callback = Restaurants.insert({ 
     createdBy: user_id, 
     createdAt: new Date(), 
     title: title 
    }); 

}, 

'userRestaurants': function(rest_id, createdBy) { 
    var restId = checkHelper(rest_id, createdBy); 
    if(restId) 
    console.log(rest_id, createdBy); 
    { 
    var callback = Meteor.users.update(
     createdBy, 
     {$addToSet: {'profile.hasRestaurants': restId}} 
    ); 
    return callback; 
    } 
} 
+0

請包括方法代碼和調用回調。 – richsilv

回答

0

我不知道爲什麼你會看到你的行爲,但我知道你有其他的問題先解決了:)

  1. 您有一個巨大的安全漏洞 - 您將用戶標識傳遞給客戶端的方法。這意味着任何人都可以簡單地打開瀏覽器控制檯並使用任何用戶標識創建一家餐館,並將其作爲所有者。相反,在方法中使用this.userId來獲取調用者的ID。

  2. 爲什麼往返服務器?只需要第一種方法更新客戶端。

所以,像這樣(未經測試,手寫這裏):

"submit .create_restaurant": function (event) { 
    event.preventDefault(); 
    var text = event.target.create_restaurant.value; 
    Meteor.call('CreateRest',text, function(error, result){ 
     if(error){ 
      alert(123); 
     }else{ 
      console.log(result); 
     } 
    }); 
    event.target.create_restaurant.value = ""; 
} 

和:

'CreateRest': function(user_id, title) { 
    check(title, String); 
    check(this.userId, String); 

    userId = this.userId; 

    Restaurants.insert({ 
     createdBy: userId, 
     createdAt: new Date(), 
     title: title 
    }, function(err, restId) { 
     if (err) throw new Meteor.Error(err); 
     Meteor.users.update(
     userId, 
     {$addToSet: {'profile.hasRestaurants': restId}}, 
     function (err, res) { 
      if (err) throw new Meteor.Error(err); 
      return restId; 
     } 
    ); 
    }); 

一旦這樣正確地實現它可能會開始工作。如果沒有,那麼這個問題與您發佈的代碼無關。

最後要說明的是,從模式角度來看,它確實是奇怪的是,你有profile.has餐廳。要找到用戶擁有您的餐館,您應該只查找餐館收藏。

+0

謝謝,我從呼叫中移動了userId,並將回調移至該方法。我已經替換了回調的最後一行:if(err)throw new Meteor.Error(err); return restId; 與: if(err)throw new Meteor.Error(err); console.log(restId); return restId; 我得到:undefined「d8BoKQsfps2WszMpS」 但是它仍然顯示提交後的「同意條款」。沒有錯誤。 –

+0

在這種情況下可能沒有必要,但一般來說我想將用戶的數據保存在它的配置文件中(像以前的訂單,收藏夾等),我想知道這是可能的,我不會得到這種類型的的問題。 –

+0

太好了。所以請標記我的答案是正確的,並給它一個upvote;) – tarmes