Meteor:this.userId和Meteor.userId()在Meteor方法中都为空

时间:2016-08-29 07:12:53

标签: javascript meteor

要将此问题归结为基本问题和最少的代码,我创建了一个简单的新流星应用程序,添加了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.userIdMeteor.userId()都返回null

这是一个流星病还是这种方法错了?

5 个答案:

答案 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-extrahttps://github.com/peerlibrary/meteor-user-extra)的软件包,它使Meteor.userId()也在发布端点函数内工作并解决了我的问题。