4

我一直在尝试this.userId从 Meteor.methods 调用中访问该变量,但是当我尝试通过 Meteor.setTimeout 或 Meteor.setInterval 调用该方法时,它似乎不起作用。

这就是我所拥有的:

if (Meteor.is_server) {
    Meteor.methods({
        getAccessToken : function() {
            try {
                console.log(this.userId);
                return Meteor.users.findOne({_id: this.userId}).services.facebook.accessToken;
            } catch(e) {
                return null;
            }
        }
    });

    var fetch_feed = function() {
        console.log(Meteor.call("getAccessToken"));
        [...] // A bunch of other code
    };

    Meteor.startup(function() {
        Meteor.setInterval(fetch_feed, 60000); // fetch a facebook group feed every minute
        Meteor.setTimeout(fetch_feed, 3000); // initially fetch the feed after 3 seconds
    });
}

观察终端日志,this.userId总是返回一个空值。但是,如果我尝试从客户端或通过控制台调用该方法,它会返回正确的 ID。

为什么这在 Meteor.setInterval 中不起作用?这是一个错误还是我做错了什么?

4

2 回答 2

2

Meteor userId 与客户端连接相关联。服务器可能与许多客户端交互,并且this.userId在方法内部会告诉您哪个客户端要求运行该方法。

如果服务器使用 Meteor.call() 来运行一个方法,那么它将没有 userId,因为它没有为任何客户端运行。

这些方法允许客户端调用要在服务器上运行的函数。对于服务器将触发自身的事情,javascript 函数将执行此操作。

于 2013-07-25T23:09:15.340 回答
-1

我使用了一个解决方案 - 有时您不想让该方法成为一个函数,但真的希望它仍然是一个方法。在这种情况下,一个 hack 使这项工作:

            var uniqueVar_D8kMWHtMMZJRCraiJ = Meteor.userId();
            Meteor.setTimeout(function() {
                    // hack to make Meteor.userId() work on next async 
                    // call to current method
                    if(! Meteor._userId) Meteor._userId = Meteor.userId;
                    Meteor.userId = function() {
                        return Meteor._userId() || uniqueVar_D8kMWHtMMZJRCraiJ
                    };
                    Meteor.apply(methodName, args);
                }
            , 100);

一些简短的解释:我们保存Meteor.userId并用一个函数Meteor._userId覆盖,如果它为真则返回,否则返回任何这一切发生之前的历史值。该历史值保存在不可能出现两次的 var name 中,因此不会发生上下文冲突。Meteor.userIdMeteor._userId()Meteor.userId()

于 2015-07-27T16:00:46.070 回答