我正在尝试编写一个简单的方法来返回登录用户的电子邮件(或任何其他字段)。我关闭了autopublish,但每当我尝试在我的displayField方法中访问Meteor.user()时,我都会被定义。
但是,如果我写一个通用函数(在Meteor之外)它可以访问它并显示它很好......我做错了什么?
Meteor.methods({
displayEmail: function () {
var user = Meteor.user();
if (!user)
throw new Meteor.Error(401, "you need to be logged in");
console.log(user.emails[0].address);
return user.emails[0].address;
}
});
我的客户端功能:
Template.hello.greeting = function () {
var output = Meteor.call('displayEmail', function(error,id) {
if (error)
return alert(error.reason);
});
return output;
};
我的模板:
...
{{greeting}}
...
就像我说的那样,console.log(user.emails [0] .address)工作正常,但我的模板中有空白......
答案 0 :(得分:0)
关闭自动发布功能后,您必须实际发布用户才能访问该数据。
自动发布会自动为您发布,但对于生产使用通常是个坏主意。当你关闭它时,你告诉Meteor你将处理所有必要的发布。
示例:
Meteor.publish("currentUser", function () {
return Meteor.users.find({_id: this.userId});
});
答案 1 :(得分:0)
回答我自己的问题,所以go-oleg是正确的,通过异步调用你需要Meteor.call中的回调函数来获取变量。
所以我的Meteor.call部分应该是这样的:
Meteor.call('displayEmail', function (error, result) {
Session.set("displayEm",result);
});
return Session.get("displayEm");
换句话说,回调函数需要设置一个Session变量(它是被动的)。 Meteor.method上的'return'是回调函数的'结果'(基本JS,我知道)。