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:
enter image description here

这完全打破了客户端应用程序,并防止任何未来的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?