在一个名为/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框架就好,读取/设置用户属性等。服务器清楚地了解用户,并清楚当前用户登录。
我完全失去了,任何解释/提示/指针都会非常感激。
答案 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 router将meteorite作为程序包安装,以允许您拥有服务器呈现的页面。 (通过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方法一样。