Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor用户助手在更新后挂起_Javascript_Meteor_Meteor Helper - Fatal编程技术网

Javascript Meteor用户助手在更新后挂起

Javascript Meteor用户助手在更新后挂起,javascript,meteor,meteor-helper,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

我有一个助手:

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

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

  • 您有一个巨大的安全漏洞—您正在将用户id从客户端传递到方法。这意味着任何人都可以简单地打开浏览器控制台,创建一个拥有任何用户id的餐厅。相反,在方法中使用this.userId来获取调用方的id

  • 为什么要往返服务器?只需让第一个方法更新客户端

  • 所以,类似这样的东西(未经测试,在这里手写):

    以及:

    一旦正确实施,它可能会开始工作。如果没有,则问题与您发布的代码无关


    最后请注意,从模式的角度来看,使用profile.hasRestaurants确实很奇怪。要查找用户拥有的餐厅,您只需在“餐厅”集合中进行查找。

    请包含方法代码和调用回调。谢谢,我将用户ID从调用中移动,并将回调移动到方法中。我已经替换了回调的最后一行:if(err)抛出新的Meteor.Error(err);返回restId;使用:如果(错误)抛出新的流星。错误(错误);console.log(restId);返回restId;我得到:未定义的“d8BoKQsfps2WszMpS”,但在提交后仍然显示“同意条款”。没有错误。在这种情况下可能不需要这样做,但一般来说,我希望将用户的数据保存在它的配置文件中(如以前的订单、收藏夹等),我想知道这是可能的,我不会遇到这种问题。太好了。所以请将我的答案标记为正确,并投上一票;)完成后,我仍然需要一些分数才能显示我的投票。所以它看起来像流星问题?我不这么认为,但我看不到你的最新代码。也许现在发布另一个问题?
    "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;
            }
          );
        });