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

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

我不知道该如何总结 – 这是毫无意义的,因为我可以使用Meteor.Account框架就好,阅读/设置用户属性等。服务器清楚地知道用户,并且当前用户明确login。

我完全失去了,任何解释/提示/指针将不胜感激。

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

它不能被放置在其他地方,因为meteor不会在用户应该绑定的代码中的那个点上知道。 如果有一个地方的客户提出某种forms的请求,可以这样做:

在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中。方法:

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

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

您需要通过陨石安装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 ,它将检查用户是否login并在login时执行你想要的操作。最初有一个redirect来将数据从localstorage转发回URI。

您可以将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... }); 

您可以使用login回拨

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

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

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