Mongoose在第二次查询时挂起

时间:2017-01-12 16:47:17

标签: node.js mongodb mongoose database

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

我创建了一个复制此问题的仓库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,
});

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

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

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

可以看到Mongo类代码here

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

1 个答案:

答案 0 :(得分:0)

我可以通过更改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));

我不太确定第一种方法导致此错误的原因。