node.js – Dark mongoose magic:“findOne的参数无效”

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

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

mongoose: Invalid argument to 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是mongoose抱怨的论点. log()将JSON.stringify()整个事情.

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

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

在这让我更加困惑……怎么可能同时出现{}和null?!

我想找的答案:

>我如何重现conds包含的这种对象?
>你将如何处理一个显然随机且很少发生的错误
>我们是否可以登录以识别conds的价值或来源?

任何想法赞赏!

解决方法

这可能是一个 node bug与PR修复 here.它还没有包含在一个版本中.

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

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...