无法访问Meteor.methods中的Meteor.user()

时间:2013-12-10 03:37:29

标签: meteor

我正在尝试编写一个简单的方法来返回登录用户的电子邮件(或任何其他字段)。我关闭了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)工作正常,但我的模板中有空白......

2 个答案:

答案 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,我知道)。