Meteor:insert产生多个条目

时间:2015-05-08 09:09:33

标签: mongodb meteor insert callback call

我的问题如下。

我开始使用meteor并为meerkat写了一些小代码。

我想将用户插入我的数据库。我首先必须使用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个条目。我相信这是因为异步回调。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

快速浏览一下,我不确定第三个(虽然我猜它是相关的),但是代码的方式是,保证至少运行两次 - 一次在服务器上,一次在客户端上。

Meteor documentation for methods中,您会看到如果您在客户端上定义方法(称为“存根”),它将同时被调用服务器方法。因此,您的客户端和服务器 BOTH 执行HTTP.call

您希望将方法放入Meteor.isServer条件中,以便只调用一次。

如果您需要,可以在searchUser块中放置单独的 Meteor.isClient方法定义,但不要放置{{ 1}}在那里或你希望服务器做的任何其他事情)。在这种情况下,它将被定义为存根,并将立即返回,而不是等待来自服务器的结果。如果你知道它将会是什么,你可以这样做来模拟服务器的结果。

执行HTTP.call时,最好只触发加载微调器(或其他东西),并使用服务器回调更新结果,等等...

Method.call

希望这有帮助!