The issue
尽管ping / pong DDP消息(和订阅)成功发送,但我遇到了一些问题,这些问题在我们的一些 生产环境 Meteor app服务器上频繁出现,其中方法调用排队但从不运行 .
What I know so far
调试非常困难,因为它是一个缩小的 生产环境 包,但这是我发现的:
打开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
),它会正确返回一个空数组 .
Where it breaks
一旦我尝试调用登录方法,问题就开始了 . 为了缩小问题范围,我使用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接收下游消息(例如订阅数据) .
Conclusions so far
到目前为止我能得出的唯一结论是 invoker._dataVisible
永远不会设置为 true
,这意味着永远不会调用回调 . 见the "_maybeInvokeCallback" function check for _dataIsVisible boolean.
Additional notes
我可以强制回调最终运行:
-
调用
Meteor.connection._stream.reconnect({_force: true});
或 -
从具有"msg: result"的chrome网络选项卡复制websocket消息,并将其作为
msg
参数设置为Meteor.connection._livedata_connected(msg)
My question
What would prevent calling the RPC login from ever invoking a callback? How can I further get to the bottom of this?