如何调试“延迟回调中的异常:错误:无法将newResults复制到_published中!”?

时间:2014-07-01 22:04:13

标签: debugging meteor

我在黑客上写了半个应用程序时出现了一个神秘的间歇性错误:

I20140701-22:39:15.859(1)? Exception in defer callback: Error: failed to copy newResults into _published!
I20140701-22:39:15.859(1)?     at Error (<anonymous>)
I20140701-22:39:15.859(1)?     at _.extend._publishNewResults (packages/mongo-livedata/oplog_observe_driver.js:767)
I20140701-22:39:15.860(1)?     at _.extend._runQuery (packages/mongo-livedata/oplog_observe_driver.js:650)
I20140701-22:39:15.861(1)?     at _.extend._runInitialQuery (packages/mongo-livedata/oplog_observe_driver.js:568)
I20140701-22:39:15.861(1)?     at OplogObserveDriver (packages/mongo-livedata/oplog_observe_driver.js:164)
I20140701-22:39:15.862(1)?     at finishIfNeedToPollQuery (packages/mongo-livedata/oplog_observe_driver.js:16)
I20140701-22:39:15.863(1)?     at _.extend.withValue (packages/meteor/dynamics_nodejs.js:56)
I20140701-22:39:15.863(1)?     at withoutInvocation (packages/meteor/timers.js:6)
I20140701-22:39:15.864(1)?     at Meteor.bindEnvironment.runWithEnvironment (packages/meteor/dynamics_nodejs.js:108)

我还没有找到一种简单的方法来重现它,所以我无法真正生成一个最小的例子。它会每隔几分钟弹出一次,也许它会以某种方式与自动重载相关。每次突然出现时,我都必须关闭所有浏览器窗口并杀死流星过程并重启,所以这是一个巨大的痛苦。

如果有人说“啊哈,这是你的问题以及如何解决它!”然后我会很高兴,但我的问题是:用什么样的策略来调试流星的胆量中的奇怪错误?

我想,我知道,我会谷歌!我发现了这个错误:https://github.com/meteor/meteor/issues/2033 这说明我的一个发布功能可能是一个格式错误的MongoDB查询。我会将它们粘贴到下面,但它们都没有任何错误中提到的任何错误,或者任何错误都会突然出现在我身上。

然后我想,我知道,我会暂时将一些调试输出破解到源文件中!但事实证明,当流星开始时,我项目的.meteor目录中的文件会被自动覆盖。那么我跟踪〜/ .meteor中的原始源文件,但事实证明,如果我编辑它然后我得到Error: unipackage load failed?并且流星拒绝启动(某种校验和或什么?)。

然后我想,我知道,我会使用调试器!我设法让节点检查器运行,甚至在相关线路上设置断点,但我无法弄清楚如何通过流星的自动重启来保持它的工作,并且我没有重新启动就无法触发错误。最终通过拧得足够多(不知道怎么做)我确实设法在调试器声称处于活动状态时触发它。什么都没发生 - 断点没有做任何事情,我只是得到了相同的日志消息。我不知道这个rube goldberg机器的哪一块有问题。

所以我有一个错误,它一直发生在我完全控制的计算机上,但我发现自己无法获得有关它的更多信息。我该怎么办?


发布功能:

# One in coffeescript
Meteor.publish("_psyAssignments", ->
  Psy.assignments.find({
      $or:
        [{_id: @userId},
         {group: {$all: [@userId]}}]
    }, {
      fields: {state: 1, group: 1, present: 1},
    }))

# Two in javascript
Meteor.publish("interactions", function () {
    return Interactions.find({$or: [{"speaker": this.userId},
                                    {"listener": this.userId,
                                     "listen_act.chosen_object":
                                       {$ne: null}}]});
});
Meteor.publish("censored_interactions", function () {
    return Interactions.find({"listener": this.userId,
                              "listen_act.chosen_object": null},
                             {fields: {speech_act: 0}});
});

3 个答案:

答案 0 :(得分:1)

我不知道您的代码发生了什么,但是当我在调试Meteor时遇到问题时,我会在&#34; try / catch&#34;中包围每个可疑代码,因为它会提供更好的错误消息

(CoffeeScript的):

try
    ...your code which might generate error...
catch e
    console.log e
快乐的调试人。

答案 1 :(得分:1)

您可以复制mongo-livedata包并将其放入应用程序的包目录中。这将导致meteor使用该包而不是本地包。然后,您可以将日志记录或任​​何需要添加到包的副本中。记得在完成后删除它:)

答案 2 :(得分:0)

首先要做的是前往Meteor's GitHub repository并搜索错误消息。结果如下:

https://github.com/meteor/meteor/blob/b37fd2af7e028a474ee5aad25b27994fb2814bf1/packages/mongo-livedata/oplog_observe_driver.js#L767

所以你的应用程序未通过完整性检查。不好。

阅读周围的代码,以及跟踪失败函数的用法是一个好主意。通常只需阅读代码即可发现可能的问题,如果没有,它将为您提供调试它们所需的内部基本知识。

现在,如果你想在该文件中放入一些调试代码,有几个选项,但其中一个显然是最简单的。 Fork Meteor的存储库,将应用程序的Meteor版本指向该存储库(在smart.json中)并在您的存储库中插入调试代码。