要将此问题归结为基本问题和最少的代码,我创建了一个简单的新流星应用程序,添加了accounts-password
包并添加了以下代码段。我的数据库中有一个测试用户。
Meteor.methods({
'testMethod': function() {
console.log('test2:', this.userId); // => null
console.log('test3:', Meteor.userId()); // => null
}
});
if (Meteor.isServer) {
Meteor.publish('testPublication', function() {
console.log('test1:', this.userId); // => 1c8tHy3zb8vP9E5yb
Meteor.call('testMethod');
});
}
if (Meteor.isClient) {
Meteor.loginWithPassword('test', 'test', function() {
Meteor.subscribe('testPublication');
});
}
如您所见,在出版物this.userId
中包含正确的userId。但在流星方法testMethod
中,this.userId
和Meteor.userId()
都返回null
。
这是一个流星病还是这种方法错了?
答案 0 :(得分:2)
这是预期的行为。这是因为您从服务器调用该方法。服务器上没有用户,因此方法调用obejct(this
)上的userId为null
。登录后尝试从客户端调用它。
答案 1 :(得分:0)
这是因为您没有从服务器向客户端返回响应。你就是这样做的:
methodName: function (arg1, arg2){
//do something with the arguements, maybe throw an error:
if(!Meteor.user()){
//it won't do anything after the error so you don't have to write an else statement
throw new Meteor.Error('You are not a user!');
}
return Meteor.userId()
},
您在客户端的电话
Meteor.call('methodName', arg1, arg2, function(err, res){
if(err){
//err is the error you throw in the method
console.log(err)
} else {
//result is what you return from your method
console.log(res)
}
});
Meteor.userId()
完全适用于方法或客户端,开箱即用。
此外,只要我记得,发布只能将光标返回到客户端。您甚至无法使用findOne()
返回找到的对象。
修改强>:
您正在从服务器出版物调用方法而不传递任何争论。如果你从客户端调用一个方法,从一个用户帐户,它不会回来为null或者即使我认为它是错误的,如果你将this.userId作为你当前的争论传递它也可能有用在您的发布中.call()
,但仍然不会在方法中为您提供Meteor.userId()。它将返回您从发布传递的争论/ ID。
答案 2 :(得分:0)
这个怎么样?
$(this).val().replace(/^0+/g, '')
答案 3 :(得分:-1)
在方法中,替换
console.log('test2:', this.userId); // => null
console.log('test3:', Meteor.userId()); // => null
使用
if(Meteor.user) //USE THIS!
{
console.log('test2:', Meteor.userId()); // => null
console.log('test3:', Meteor.userId()); // => null
}
this.userid不会在方法方面工作。但是,使用Meteor.userId返回调用方法调用的用户的id。
答案 4 :(得分:-2)
经过大量的讨论和一些答案之后,似乎Meteor Methods并不打算从服务器端调用,如果没有从客户端调用,则userId根本不可用。尽管这根本没有帮助,但是框架的反直觉行为,也就是Meteor的工作方式。
然而,有一个名为meteor-user-extra
(https://github.com/peerlibrary/meteor-user-extra)的软件包,它使Meteor.userId()
也在发布端点函数内工作并解决了我的问题。