问题
我遇到了一个问题,这个问题在我们的一些生产Meteor应用服务器上半频繁出现,其中方法调用排队但从不运行,尽管ping / pong DDP消息(和订阅)成功发送。
到目前为止我所知道的
调试非常困难,因为它是一个缩小的生产包,但这是我发现的:
打开Chrome控制台和调用方法按预期工作(我收到onResultReceived
回调和普通异步回调)。例如:
Meteor.apply('someMethod', [], {
onResultReceived: function() {
console.log('results received');
}
}, function(e, r) {
console.log(e);
console.log(r);
});

正确记录:
results received
null
someresult
如果我检查DDP连接的未完成方法块(Meteor.connection._outstandingMethodBlocks
),它会正确返回一个空数组。
它破裂的地方
一旦我尝试调用登录方法,问题就开始了。为了缩小问题范围,我使用apply调用Meteor login
方法,如下所示:
var loginArgs = [{
user: {email: 'user@site.com'},
password: Accounts._hashPassword('secretpassword')
}];
var options = {};
options.onResultReceived = function() { console.log(arguments); };
Meteor.apply('login', loginArgs, options, function (err, result) {
console.log('--')
console.log(err);
console.log('--')
console.log(result);
});

一旦运行,onResultReceived
将使用我的userId,token和tokenExpires激活并正确返回。 websocket消息在我的devtools网络选项卡中可见。但由于某种原因,回调永远不会被解雇。
如果我此时检查Meteor.connection._outstandingMethodBlocks
,我的login
方法调用中仍有一个对象,但方法块methods
数组为空。
如果我检查Meteor.connection._methodInvokers
,我仍然可以在那里看到具有以下属性的MethodInvoker:
这完全打破了客户端应用程序,并阻止任何未来的Meteor方法被调用,尽管我仍然可以从websockets接收下游消息(例如订阅数据)。
到目前为止的结论
到目前为止,我可以得出的唯一结论是invoker._dataVisible
永远不会设置为true
,这意味着永远不会调用回调。见the "_maybeInvokeCallback" function check for _dataIsVisible boolean.
附加说明
我可以强制回调最终运行:
Meteor.connection._stream.reconnect({_force: true});
或Meteor.connection._livedata_connected(msg)
参数msg
醇>
我的问题
什么会阻止调用RPC login
来调用回调?我怎样才能进一步深入了解?