Mongoose 挂起第二个查询

Posted

技术标签:

【中文标题】Mongoose 挂起第二个查询【英文标题】:Mongoose hangs on second query 【发布时间】:2017-05-27 21:13:35 【问题描述】:

我正在使用 Mongoose 对 MongoDB 进行查询,但遇到了一个奇怪的问题,即我的第二个查询会导致 Mongoose 挂起并且不返回结果。

我创建了一个 repo 来复制这个问题 here。如果您愿意,您可以克隆并在本地运行它。只需按照Usage 的说明操作即可。

数据集

name,address,city,state,zip
Jane Doe,123 Main St,Whereverville,CA,90210
John Doe,555 Broadway Ave,New York,NY,10010

一个查询

const mongo = new Mongo();

const dataSet1 = await mongo.find('locations', 
  limit: 1,
);
// const dataSet2 = await mongo.find('locations', 
//   limit: 2,
// );

mongo.close();

console.log(
  dataSet1,
  // dataSet2,
);

这里我们查询位置集合并只返回一个文档。

Mongoose default connection open to
 dataSet1:
   [  _id: 5877b4568f5c931b5f84cd93,
       name: 'Jane Doe',
       address: '123 Main St',
       city: 'Whereverville',
       state: 'CA',
       zip: '90210'  ] 
Mongoose default connection disconnected

如预期的那样,返回一个文档。

两个查询

const mongo = new Mongo();

const dataSet1 = await mongo.find('locations', 
  limit: 1,
);
const dataSet2 = await mongo.find('locations', 
  limit: 2,
);

mongo.close();

console.log(
  dataSet1,
  dataSet2,
);

这里我们对两个文档的位置集合进行第二次查询。

>>> RESTARTING <<<
(node:87245) DeprecationWarning: Calling an asynchronous function without callback is deprecated.
Mongoose default connection open to
^C

进程挂起并且不返回任何内容。无法完全弄清楚为什么会发生这种情况。

Mongo类代码可见here。

编辑: - 更新代码以使用本机承诺,但问题仍然存在。

【问题讨论】:

请在此处阅读 - mongoosejs.com/docs/promises.html 他们不完整的“承诺” 谢谢,我查看了您的链接并决定使用本机承诺。我已经更新了Mongo.js。但是它仍然挂起,并带有不同的警告DeprecationWarning: Calling an asynchronous function without callback is deprecated。您认为这与我的问题有关吗? 使用文档中描述的 .then()。这可能是潜在的问题,但如果你想避免使用回调等,请使用适当的库,如 fibersnode-sync 等。虽然我自己没有将它们与猫鼬一起使用,但给它一个如果你想试试。更多信息在这里***.com/questions/16763890/… 【参考方案1】:

我可以通过将Mongo.js 中的代码更改为:

db.on('error', (err) => reject(err));
db.on('open', () => 
  model.find(query, fields, options)
    .limit(limit)
    .exec()
    .then(docs => resolve(docs))
    .catch(err => reject(err));
  );
);

model.find(query, fields, options)
  .limit(limit)
  .exec()
  .then(docs => resolve(docs))
  .catch(err => reject(err));

我不太清楚为什么第一种方法会导致这个错误。

【讨论】:

以上是关于Mongoose 挂起第二个查询的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬没有加入两个系列

使 mongoose.js 查询同步运行

使 mongoose.js 查询同步运行

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

Mongoose 回调函数如何知道第二个参数是啥 db.query 结果?