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

时间:2017-02-22 17:09:26

标签: node.js mongoose

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

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

  

mongoose:findOne()的参数无效

我们检查了所有查询,但无法找到这些问题的来源。错误调用堆栈每次都不同(没有特定的mongoose调用似乎导致此问题)所以我们认为这不是特定于业务逻辑。

为了进行一些调试,我们添加了以下日志记录,以防再次出现错误:

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是猫鼬抱怨的论点。 log()将JSON.stringify()整个事情。

这是此次调用产生的日志之一:

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

现在这让我更加困惑......怎样才能同时{}null

我正在寻找答案:

  • 如何重现conds包含的此类对象?
  • 你如何处理一个显然随机且很少发生的错误?
  • 我们是否可以登录以确定conds的价值或来源?

任何想法都赞赏!

1 个答案:

答案 0 :(得分:5)

这可能是node bug,PR需要修复here。它尚未包含在发行版中。

它不可靠再现,因为它似乎依赖于指针和v8的垃圾收集。只是等待它在上游修复。