流星"登录"方法永远不会调用回调,阻止所有未来的RPC调用

时间:2017-05-06 19:49:23

标签: javascript meteor rpc meteor-accounts

问题

我遇到了一个问题,这个问题在我们的一些生产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: enter image description here

这完全打破了客户端应用程序,并阻止任何未来的Meteor方法被调用,尽管我仍然可以从websockets接收下游消息(例如订阅数据)。

到目前为止的结论

到目前为止,我可以得出的唯一结论是invoker._dataVisible永远不会设置为true,这意味着永远不会调用回调。见the "_maybeInvokeCallback" function check for _dataIsVisible boolean.

附加说明

我可以强制回调最终运行:

  1. 调用Meteor.connection._stream.reconnect({_force: true});
  2. 从我的Chrome网络标签复制websocket消息,该标签包含" msg:result"并将其作为Meteor.connection._livedata_connected(msg)参数
  3. 添加到msg

    我的问题

    什么会阻止调用RPC login来调用回调?我怎样才能进一步深入了解?

0 个答案:

没有答案