黑暗mongoose的魔法:“无效的参数findOne”

在共享相同的持久层(包含查询的共享模块)时,我们有几个使用mongoose的nodejs守护进程。

在其中一个守护进程中(总是同一个守护进程),我们随机地(一周几次)从mongoose处得到以下错误:

mongoose:findOne()的参数无效

我们已经检查了所有的查询,但无法找出这可能来自哪里。 错误调用堆栈每次都是不同的( 没有具体的mongoose调用似乎导致这个问题 ),所以我们不认为这是特定于业务逻辑。

为了做一些debugging,我们添加了以下日志logging,以防错误再次发生:

log({ // What mongoose checks (both false -> the error). isInstanceOfMQuery: conds instanceof mquery, isObject: mquery.utils.isObject(conds), // Trying to find out what this value is. conds, toString: Object.prototype.toString.call(conds) inspect: util.inspect(conds, { showHidden: true, depth: null, showProxy: true }) }) 

conds是mongoose抱怨的说法。 日志()将JSON.stringify()整个事情。

这是这个调用导致的日志之一:

 { "isInstanceOfMQuery": false, "isObject": false, "conds": {}, "toString": "[object Null]" "inspect": "{}", } 

现在,这使我更加困惑…… conds如何同时为null

解决方法我在寻找:

  • 我怎样才能再现conds包含的这种对象?
  • 你将如何处理显然是随机发生的错误?
  • 有更多的我们可以login,以确定康德有什么样的价值或来自哪里?

任何想法赞赏!

这可能是PR在这里解决的一个节点错误 。 它还没有包含在发行版中。

这不是可靠的重现,因为它似乎取决于指针和V8的垃圾收集。 只是要等待它被固定在上游。