如何让Meteor.user()在服务器端返回?

时间:2013-05-13 22:39:37

标签: meteor

在一个名为/server/main.js的文件中(为了确保它最后加载)。

console.dir(Meteor.user());

抛出:

Error: Meteor.userId can only be invoked in method calls. Use this.userId in publish functions.

所以我尝试在同一个文件中使用:

console.dir(this.userId);

返回:

undefined

所以,不要放弃,我在想“没关系,我只能从标题中的cookie中读取”:

var connect = Npm.require('connect');

__meteor_bootstrap__.app.use(connect.query()).use(function(req, res, next) {
    console.dir(req.headers);
    next();
});
除了'cookie:'uvf = 1''

之外,

....不会返回cookie

我不确定该结论 - 这是毫无意义的,因为我可以使用Meteor.Account框架就好,读取/设置用户属性等。服务器清楚地了解用户,并清楚当前用户登录。

我完全失去了,任何解释/提示/指针都会非常感激。

4 个答案:

答案 0 :(得分:52)

您必须在客户端发出请求的地方使用Meteor.user()(例如Meteor.methods或Meteor.publish)。

它不能放在其他地方,因为meteor在用户应该绑定的代码中不会知道。如果某个地方有来自客户的某种形式的请求,它可以这样做:

在Meteor.publish中:

Meteor.publish("collection", function() {
    //returns undefined if not logged in so check if logged in first
    if(this.userId) {
        var user = Meteor.users.findOne(this.userId);
        //var user is the same info as would be given in Meteor.user();
    }
});

在Meteor.methods中:

Meteor.methods({
    "test":function() {
        //should print the user details if logged in, undefined otherwise.
        console.log(Meteor.user());
    }
}

在服务器端路由上使用Meteor.user():

您需要通过Meteor routermeteorite作为程序包安装,以允许您拥有服务器呈现的页面。 (通过mrt install router安装)

然后,服务器端路由可以处理Web请求:

 Meteor.Router.add('/awebpage', function(id) {
     var userId = this.params.userid;
     var logintoken = this.params.logintoken;
     var isdirect = this.param.direct;
     var user = Meteor.users.findOne({_id:userId,"services.resume.loginTokens.token":logintoken});
     if(user) {
         //the user is successfully logged in

         return "You, "+user.profile.name+", are logged in!";
     }
     else
     {
         if(isdirect) {
             return "<h3>Loading</h3><script>window.location.href="/awebpage?direct=true&userid="+localStorage.getItem("Meteor.userId") +"&logintoken="+localStorage.getItem("Meteor.loginToken")</script>";
         }
         else
         {
             return "Not logged in"
         }
     }
 });

现在,当您访问/awebpage时,它会检查用户是否已登录并在登录时执行您想要的操作。最初,有一个重定向将数据从localstorage中继回URI。

答案 1 :(得分:3)

您可以将带有Meteor.publish()的userId公开到全局范围。然后,您可以将它与Meteor.Router的服务器端路由一起使用。

-

/server/publications.js

CurrentUserId = null;
Meteor.publish(null, function() {
    CurrentUserId = this.userId;
});

-

/server/routes.js

Meteor.Router.add('/upload', 'POST', function() {
    if (!CurrentUserId)
        return [403, 'Forbidden'];

    // proceed with upload...
});

答案 2 :(得分:2)

您可以使用已登录的回调

Accounts.onLogin((obj)->
  user = ob.user
)

Accounts.onLogin(function(obj){
  var user = ob.user
})

答案 3 :(得分:-1)

我最近写了一篇博文,描述了解决方案:https://blog.hagmajer.com/server-side-routing-with-authentication-in-meteor-6625ed832a94

您基本上需要使用https://atmospherejs.com/mhagmajer/server-router包设置服务器路由,并且您可以使用this.userId获取当前用户,就像使用Meteor方法一样。