2014-07-16 38 views
3

我使用Mongoose和Bluebird,並在使用包含時間戳排序的查詢時遇到錯誤。我試圖只檢索最近的條目。查詢在使用內置的Promise時起作用。承諾沒有方法「排序」

任何想法?謝謝!

var Promise  = require("bluebird"),  
    mongoose  = require('mongoose'); 

var Item = Promise.promisifyAll(mongoose.model("Item")); 
Promise.promisifyAll(Item.prototype); 
var connect = function() { 
    var options = { server: { socketOptions: { keepAlive: 1 } } }; 
    var mongoUrl = "mongodb://" + config.mongo.host + ":" + config.mongo.port + "/" + config.mongo.db; 
    mongoose.connect(mongoUrl, options); 
}; 
connect(); 

Item.findAsync({item_id: "03010200400000a0bf00210"}).sort({ts:-1}).limit(1); 
Possibly unhandled TypeError: Object [object Promise] has no method 'sort' 
    at Object.module.exports.process (/Source/updater2/checkAndUpdate.js:88:75) 
    at /Source/tellme/updater2/test1.js:25:20 
    at tryCatch1 (/Source/updater2/node_modules/bluebird/js/main/util.js:43:21) 
    at Promise$_callHandler [as _callHandler] (/Source/updater2/node_modules/bluebird/js/main/promise.js:627:13) 
    at Promise$_settlePromiseFromHandler [as _settlePromiseFromHandler] (/Source/updater2/node_modules/bluebird/js/main/promise.js:641:18) 
    at Promise$_settlePromiseAt [as _settlePromiseAt] (/Source/updater2/node_modules/bluebird/js/main/promise.js:804:14) 
    at Promise$_settlePromises [as _settlePromises] (/Source/updater2/node_modules/bluebird/js/main/promise.js:938:14) 
    at Async$_consumeFunctionBuffer [as _consumeFunctionBuffer] (/Source/updater2/node_modules/bluebird/js/main/async.js:75:12) 
    at Async$consumeFunctionBuffer (/Source/updater2/node_modules/bluebird/js/main/async.js:38:14) 
    at process._tickCallback (node.js:419:13) 
Mongoose:item.find({ item_id: '03010200400000a0bf00210' }) { fields: undefined } 
+0

這是否工作沒有'.sort'?你怎麼結合藍鳥和貓鼬? – loganfsmyth

回答

11

試試這個

return Item.find({item_id: "03010200400000a0bf00210"}).sort({ts:-1}).limit(1).execAsync(); 
+0

嘗試此操作時,出現錯誤「可能未處理的TypeError:對象#沒有方法'execAsync'」。我添加了一些更多的代碼來解釋我如何打電話給藍鳥。 – user1074891

+1

@ user1074891你需要promisify貓鼬類 - 'Promise.promisifyAll(require(「mongoose」));' – Esailija

+0

再次感謝@Esailija。你搖滾。 – user1074891

-1

假設Item.findAsync返回一個承諾,沒有實際效果,你需要等待,直到你對它們進行排序之前將結果返回...

return Item.findAsync({item_id: "03010200400000a0bf00210"}) 
    then(function(items) { 
     return items.sort({ts:-1}).limit(1); 
    }); 
+0

嘗試此操作時,出現錯誤「可能未處理的TypeError:Object has no method'limit'」。 – user1074891

0
var options = { 
     sort: { ts: -1 }, 
     limit: 1 
    };  
var query = {item_id: "03010200400000a0bf00210"}; 
Item.findAsync(query,null,options).then(function(data){ 
    console.log(data); 
    }).catch(function(err){ 
    console.log(err); 
    });