2017-01-12 162 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)); 

我不明白爲什麼第一種方法導致此錯誤。