嵌套时mongoose geoindex失败

时间:2016-02-16 06:00:24

标签: node.js mongodb express bluebird geo

我试图根据与另一个集合中给定对象的地理位置接近来检索一组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)确实在运行。

1 个答案:

答案 0 :(得分:0)

在Mongoose 4.x中,您可以插入任何使用Mongoose的promise库。我不确定你的findAsync方法是否实际返回了一个promise,即使它定义了.then()个方法。

来自Mongoose docs:

 // Use bluebird
 mongoose.Promise = require('bluebird');

然后,您可以通过调用.find(query).exec();来调用任何Mongoose查询,这会返回完整的蓝鸟承诺。