我的问题如下。
我开始使用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个条目。我相信这是因为异步回调。
我做错了什么?
答案 0 :(得分:3)
快速浏览一下,我不确定第三个(虽然我猜它是相关的),但是代码的方式是,保证至少运行两次 - 一次在服务器上,一次在客户端上。
在Meteor documentation for methods中,您会看到如果您在客户端上定义方法(称为“存根”),它将同时被调用服务器方法。因此,您的客户端和服务器 BOTH 执行HTTP.call
您希望将方法放入Meteor.isServer
条件中,以便只调用一次。
如果您需要,可以在searchUser
块中放置单独的 Meteor.isClient
方法定义,但不要放置{{ 1}}在那里或你希望服务器做的任何其他事情)。在这种情况下,它将被定义为存根,并将立即返回,而不是等待来自服务器的结果。如果你知道它将会是什么,你可以这样做来模拟服务器的结果。
执行HTTP.call
时,最好只触发加载微调器(或其他东西),并使用服务器回调更新结果,等等...
Method.call
希望这有帮助!