MongoDB - 使用nodejs驱动程序运行并行promise不能与多个数据库

时间:2017-04-20 02:46:08

标签: javascript node.js mongodb promise

我有这个代码,我只得到1 Promise的结果,我通过评论其中一个单独尝试每个,他们实际上解决没有错误,但当他们在一起时,我只得到第一个的结果。 但不是来自Promise.all,只有Promise中的console.log被称为

var mongodb = require('mongodb');
var Promise = require('bluebird');

var $ = mongodb.MongoClient.connect('mongodb://nobody:nobody@localhost/dbauth');
$.then(
(db) => {
    var pp = [];
    pp.push(new Promise(
     (resolve, reject) => {
        var dbx = db.db('db1');
        dbx.authenticate('user1', 'user1').then((x) => {
            console.log(x); // true
            var o = dbx.stats();
            o.then(
               (result) => {
                  console.log(result);
                  resolve(result);
               }
            ).catch(
               (err) => {
                   reject(err);
               }
            );
        });
     }));

    pp.push(new Promise(
     (resolve, reject) => {
       var dbx = db.db('db2');
       dbx.authenticate('user2', 'user2').then((x) => {
            console.log(x);
            var o = dbx.stats();
            o.then(
               (result) => {
                  console.log(result);
                  resolve(result);
               }
            ).catch(
               (err) => {
                   reject(err);
               }
            );
       });
    }));

    return Promise.all(pp).then(
        (res) => {
            res.forEach(console.log);
        }
    ).catch(console.log);
}).catch(console.log);

这是什么打印

true // from console.log(x); of promise db1 -> auth successful
true // from console.log(x); of promise db2 -> auth successful
{ db: 'db1',
  collections: 2,
  views: 0,
  objects: 0,
  avgObjSize: 0,
  dataSize: 0,
  storageSize: 8192,
  numExtents: 0,
  indexes: 2,
  indexSize: 8192,
  ok: 1 } // from console.log(res) of promise db2

但如果我从两者承诺的代码中删除此部分并调用resolve(x)

,相同的代码将正常工作
                o.then(
                   (result) => {
                      console.log(result);
                      resolve(result);
                   }
                ).catch(
                   (err) => {
                       reject(err);
                   }
                );

为什么实际承诺在Promise.all之前执行?

更新 - >这样做了

我将代码更改为这样,但它也不起作用

var mongodb = require('mongodb');
var Promise = require('bluebird');

var $ = mongodb.MongoClient.connect('mongodb://nobody:nobody@localhost/dbauth');
$.then((db) => {

    var db1 = db.db('db1');
    var db2 = db1.db('db2');

    var p1 = db1.authenticate('user1', 'user2').then((x) => {
        return db1.stats();
    });

    var p2 = db2.authenticate('user2', 'user2').then((x) => {
        return db2.stats();
    });

    return Promise.all([p1,p2]).then(console.log);
}).catch(console.log);

更新2 - >这个工作但不是我想要的

我将我的代码更改为这样,并且它有效! ...但这不是我想要的,我想要的是让两个Promise以异步方式执行

var $ = mongodb.MongoClient.connect('mongodb://nobody:nobody@localhost/dbauth');
$.then((db) => {
    var db1 = db.db('db1');
    var p1 = db1.authenticate('user1', 'user2').then((x) => {
        return db1.stats().then(
            (res) => {
                console.log(res);
                var db2 = db1.db('db2');
                return db2.authenticate('user2', 'user2').then((x) => { 
                    return db2.stats();
                });
            }
        );
    });
    p1.then(console.log);
}).catch(console.log);

它接缝是MongoDB问题吗?

更新3 - >这样做了

const px = (dbx, user, pass) => {
    return dbx.authenticate(user, pass).then((x) => {
        return dbx.stats()
    });
}

var $ = mongodb.MongoClient.connect('mongodb://nobody:nobody@localhost/dbauth');
$.then((db) => {
    Promise.all([
        px(db.db('db1'), 'user1', 'user1'),
        px(db.db('db2'), 'user2', 'user2')
    ]).then(console.log);
}).catch(console.log);

2 个答案:

答案 0 :(得分:0)

我根本没读过你的问题。但是,这个:

return Promise.all([pp]).then(
    (res) => {
        res.forEach(console.log);
    }
).catch(console.log);

似乎错误因为pp是一个我相信的数组。意思是:[[whatever is in pp]]

答案 1 :(得分:0)

这是一个MongoDB问题,我们无法运行并发auth操作

https://jira.mongodb.org/browse/NODE-984