我试图根据与另一个集合中给定对象的地理位置接近来检索一组mongodb记录。我使用蓝鸟提供承诺。但是当我的查询嵌套在查找的.then
子句中时,geoindex搜索失败 - 它似乎既没有抛出.catch
错误,也没有触发代码。
router.post("/alert", function(req, res) {
User.findOneAsync ({'loc.coordinates' : {
$near : {
$geometry : {
type: "Point",
"coordinates" : [45.001,45.001]
},
$maxDistance : 1000000
}
}}).then(function(users) {
console.log("users actually are " + users)
})
Event.findAsync({
_id : req.body.eventId
}).then(function(evt) {
console.log(evt)
User.findAsync({'loc.coordinates' : {
$near : {
$geometry : {
type: "Point",
"coordinates" : [45.001,45.001]
},
$maxDistance : 1000000
}
}}).then(function(users) {
console.log("users are " + users)
}).catch(function(err) {
console.log(err)
})
console.log('done')
}).catch(function(err) {
console.log(err)
})
res.send('ok')
})
调用时,对用户的第一个查询将成功。这是我可以在mongodb控制台中运行的相同查询,并获得相同的结果。但是第二个,检索到一个事件,.then(function(evt))
块中没有任何代码发生,并且.catch也没有被触发。
这是一个比它可能更大的问题,因为我需要使用的坐标实际上来自Event
模型,所以我需要检索该信息以实际查询Users
... < / p>
这一行,console.log(evt)
确实在运行。
答案 0 :(得分:0)
在Mongoose 4.x中,您可以插入任何使用Mongoose的promise库。我不确定你的findAsync方法是否实际返回了一个promise,即使它定义了.then()
个方法。
来自Mongoose docs:
// Use bluebird
mongoose.Promise = require('bluebird');
然后,您可以通过调用.find(query).exec();
来调用任何Mongoose查询,这会返回完整的蓝鸟承诺。