37

在一个名为 /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

4 回答 4

53

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

它不能放在其他任何地方,因为流星在那个时候不会知道用户应该绑定到的代码。如果有一个地方从客户端发出某种形式的请求,它可以这样做:

在 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将Meteor 路由器安装为一个包,以允许您拥有服务器渲染页面。(通过安装)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。

于 2013-05-14T00:14:22.293 回答
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...
});
于 2013-07-23T17:23:43.523 回答
2

您可以使用登录的回调

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

Accounts.onLogin(function(obj){
  var user = ob.user
})
于 2014-11-29T06:50:23.053 回答
-1

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

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

于 2017-05-17T23:34:53.853 回答