2017-01-12 137 views
0

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

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

编辑: - 更新后的代码使用原生承诺,但问题仍然存在。

+0

请在这里阅读 - http://mongoosejs.com/docs/promises.html他们不完整的“承诺” –

+0

谢谢,我看着你的链接,并决定使用本地承诺。我更新了[Mongo.js](https://github.com/purplecones/stackoverflow-mongoose-query-issue/blob/master/Mongo.js)。它仍然会挂起,但使用不同的警告'DeprecationWarning:调用不带回调的异步函数已被弃用。你认为这与我的问题有关吗? – purplecones

+0

使用.then(),因为它们在文档中描述它。这可能是潜在的问题,但在这种情况下,如果你想避免使用回调等使用像'纤维'或'节点同步'等适当的库。没有使用它们与猫鼬自己虽然,但给它是一个尝试,如果你想。更多信息在这里http://stackoverflow.com/questions/16763890/how-to-avoid-deep-nested-code-with-mongoose-node –

回答

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)); 

我不明白为什么第一种方法导致此错误。