如何让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
来获取当前用户。