更新后,Meteor用户帮助程序挂起

时间:2016-01-20 06:18:35

标签: javascript meteor meteor-helper

我有这个帮手:

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

1 个答案:

答案 0 :(得分:0)

我不知道为什么你会看到你的行为,但我知道你还有其他问题要先解决:)

  1. 您有一个巨大的安全漏洞 - 您将用户ID从客户端传递给该方法。这意味着任何人都可以简单地打开浏览器控制台并创建一个餐馆,其中包含他们喜欢的任何用户ID作为所有者相反,在方法中使用this.userId来获取调用者的id。

  2. 为什么往返服务器?只需让第一种方法更新客户端。

  3. 所以,像这样(未经测试,在这里手写):

    "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.hasRestaurants。要查找用户拥有的餐馆,您应该只在餐馆集上查找。