2015-05-08 66 views
1

我的问题如下。流星:插入产生多个条目

我开始使用流星,并写了一些针对猫鼬的小代码。

我想将用户插入到我的数据库中。我首先必须用meerkatId的用户名称呼叫meerkat,然后才能获取用户信息。

这是我的代码。

Users = new Mongo.Collection("users"); 
 

 

 
if (Meteor.isClient) { 
 

 
Template.body.helpers({ 
 
    users: function() { 
 
     // Otherwise, return all of the tasks 
 
     return Users.find({}); 
 
    } 
 

 
}); 
 

 
Template.user.helpers({ 
 
    parentUsername: function (parentContext) { 
 

 
     return parentContext.info.username; 
 
    } 
 
    
 
}); 
 

 
    
 
Template.body.events({ 
 
    "submit .user-search": function (event) { 
 
    // This function is called when the new task form is submitted 
 
    event.preventDefault(); 
 
    Meteor.call("removeAllUsers"); 
 
    Meteor.call("searchUser", $("#username").val()); 
 

 

 
    //event.target.text.value = ""; 
 
    // Prevent default form submit 
 
    return false; 
 
    } 
 

 
}); 
 

 

 

 
Template.user.events({ 
 
    "click .getUserBroadcast": function() { 
 
    // Set the checked property to the opposite of its current value 
 
    Meteor.call("getUserBroadcasts", this._id, this.meerkatId); 
 
    } 
 
}); 
 

 
    
 
} 
 

 
if (Meteor.isServer) { 
 
    Meteor.startup(function() { 
 
    // code to run on server at startup 
 
    Users.remove({}); 
 
    }); 
 
} 
 

 

 
Meteor.methods({ 
 
    searchUser: function (username) { 
 
    HTTP.call("PUT", "https://social.meerkatapp.co/users/search?v=2", 
 
      {data: {"username": username}}, 
 
      function (error, result) { 
 
      if (!error) { 
 
       content=JSON.parse(result.content); 
 
       Meteor.call("getUserInfos", content.result[0]); 
 
      } 
 
      }); 
 

 
    }, 
 

 
    getUserInfos: function(meerkatId){ 
 
     HTTP.call("GET", "https://resources.meerkatapp.co/users/"+meerkatId+"/profile?v=1.0", 
 
      {}, 
 
      function (error, result) { 
 
      if (!error) { 
 
       contentJson=JSON.parse(result.content); 
 
       console.log(contentJson.result); 
 
      
 
       Users.insert(contentJson.result); 
 
      } 
 
      }); 
 
    }, 
 
    removeAllUsers: function() { 
 
     return Users.remove({}); 
 
    } 
 
});

有人能告诉我为什么这个解决了3个相同的用户条目(_id的当然不是),而得到的控制台输出只有一次?

当我在searchUser方法中插入时,我得到2个条目。我相信这是因为异步回调。

我在做什么错?

回答

3

快速浏览,我不知道第三(虽然我猜它是有关),但与它的代码是这样的,是为保证运行至少两次 - 在一次服务器和一次在客户端上。

Meteor documentation for methods,你会发现,如果你定义客户端上的方法(被称为“存根”),这将是称为同时作为服务器的方法。因此,您的客户端和服务器BOTH做一个HTTP.call

你想把方法为Meteor.isServer条件,因此被调用一次。

如果你想,你可以把一个单独searchUser方法定义一个Meteor.isClient块内,但不要把HTTP.call内有或其他任何你想要的服务器做的)。在这种情况下,它将被定义为存根,并将立即返回而不是等待服务器的结果。如果你知道它将会发生什么,你可以这样做来模拟服务器的结果。

你可能最好还是触发装载微调(或其它)在执行Method.call,并与从服务器回调,阿拉更新结果...

Method.call("methodNameOnServer", function clientCallback(results) { // do something. }); 

希望这有助于!