Node JS - 处理多个查询(promise,bluebird)

时间:2016-01-30 14:40:04

标签: javascript node.js mongodb promise bluebird

如果是新的Node JS(我使用的是MongoDB,Express和Mongoose)并且我遇到以下问题,我会很慷慨:

有一个包含10个地址ID的数组,在执行其他操作之前,我需要检查地址中的所有是否在数据库中。我知道mongoose会进行异步查询,我试图使用Bluebird(https://www.npmjs.com/package/bluebird)来做出承诺,但仍然没有运气:

以下是一些尝试:

第一

var checkIds = function(idsArray){
    return new Promise(function(resolve, reject){
        var result = undefined;
        idsArray.forEach(function(id){
            Address.count({_id: id}, function(err, count){
                //count is 0 if id does not exist  
                if(err || !count){
                    reject(false);
                }
            });
        resolve(true); 
        });
    }
}

第二

var checkIds = function(idsArray){
    return new Promise(function(resolve, reject){
    var result = 0;
    for(var i = 0; i < idsArray.lenght; i++){
        Address.count({_id: idsArray[i]}, function(err, count){

            if(err || !count){
                reject(false);
            }else{
                result++;
            }

        });
    }
    resolve(result == 10 ? true : false);
    });
}

即使数组只包含有效的ID,第一次尝试的承诺返回总是未定义,第二次尝试的 false

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

可能有一些方法可以宣传MongoDB并进行查询以简化这一过程,但您也可以创建一个承诺数组并使用Promise.all

var checkIds = function(idsArray){
    var promises = [];

    idsArray.forEach(function(id){
        var promise = new Promise(function(resolve, reject){

            Address.count({_id: id}, function(err, count){
                if(err or !count){
                    reject(false);
                } else {
                    resolve(true);
                }
            });
        }); 

        promises.push(promise);
    }
    return Promise.all(promises);
}

然后再做

checkIds(['id1', 'id2', 'id3']).then(function(values) {
    // success
}, function(reason) {
    // fail
})

答案 1 :(得分:1)

你可以尝试的是这样的事情

model.find({ '_id': {$in: idsArray} }, function(err, docs) {
    if(docs.length == 10) {
        console.log("Your 10 docs with the 10 Ids are in your Database");
    }
})

你甚至可以使用&#34; count&#34;像这样

model.count({ '_id': {$in: idsArray} }, function(err, count) {
    if(count == 10) {
        console.log("Your 10 docs with the 10 Ids are in your Database");
    }
})