【问题标题】:Using native ES6 promises with MongoDB在 MongoDB 中使用原生 ES6 Promise
【发布时间】:2015-09-25 23:50:23
【问题描述】:

我知道 Mongo 的 Node 驱动程序可以是 promisified 使用外部库。我很想知道 ES6 Promise 是否可以与 MongoClient.connect 一起使用,所以我尝试了这个(使用 Babel 5.8.23 进行转译):

import MongoClient from 'mongodb';

function DbConnection({
  host = 'localhost',
  port = 27017,
  database = 'foo'
}) {
  return new Promise((resolve, reject) => {
    MongoClient.connect(`mongodb://${host}:${port}/${database}`, 
    (err, db) => {
      err ? reject(err) : resolve(db);
    });
  });
}

DbConnection({}).then(
  db => {
    let cursor = db.collection('bar').find();
    console.log(cursor.count());
  },
  err => {
    console.log(err);
  }
);

输出为{Promise <pending>}。与游标有关的任何事情似乎都会产生类似的结果。有没有办法解决这个问题,还是我完全找错了树?

编辑:节点版本 4.1.0。

【问题讨论】:

    标签: javascript node.js mongodb babeljs es6-promise


    【解决方案1】:

    没有什么可以解决的,这是预期的行为。 cursor.count() 返回一个promise,如果你想要这个值,你需要使用.then,例如

    DbConnection({}).then(
     db => {
        let cursor = db.collection('bar').find();
        return cursor.count();
      }
    }).then(
      count => {
        console.log(count);
      },
      err => {
        console.log(err);
      }
    );
    

    或简化

    DbConnection({}).then(db => db.collection('bar').find().count()).then(
      count => console.log(count),
      err => console.log(err)
    );
    

    【讨论】:

    • 好悲痛。谢谢,显然我已经盯着它太久了!
    • 我们都有这样的时光 :)
    • IME,不需要err => { console.log(err } - 只需将console.log 放入.then 错误参数中
    【解决方案2】:

    loganfsmyth 响应的另一种语法(顺便谢谢)

    cursor.count().then(function(cursor_count){
      if(cursor_count){
        // use cursor
      }else{
        // no results
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2016-11-27
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      相关资源
      最近更新 更多