Node.js承诺与mongoskin

Rob*_*Rob 5 mongodb node.js promise express mongoskin

我正在尝试避免在进行mongodb查询时使用回调.我正在使用mongoskin来打电话:

req.db.collection('users').find().toArray(function (err, doc) {
  res.json(doc);
});
Run Code Online (Sandbox Code Playgroud)

在许多情况下,我需要进行多个查询,所以我想使用Node.js promise库,但我不知道如何将这些函数包装为promises.我看到的大多数例子对于像readFile我这样的事情都是微不足道的,我猜在这种情况下我需要以某种方式包装到Array?可以这样做,还是必须由mongoskin实现?

一个例子可以是任何一组回调,查找/插入,查找/查找/插入,查找/更新:

req.db.collection('users').find().toArray(function (err, doc) {
  if (doc) {
    req.db.collection('users').find().toArray(function (err, doc) {
      // etc...
    });
  }
  else {
    // err
  }
});
Run Code Online (Sandbox Code Playgroud)

Esa*_*ija 4

您可以使用 bluebird 来 Promisify 整个模块:

var Promise = require("bluebird");
var mongoskin = require("mongoskin");
Object.keys(mongoskin).forEach(function(key) {
  var value = mongoskin[key];
  if (typeof value === "function") {
    Promise.promisifyAll(value);
    Promise.promisifyAll(value.prototype);
  }
});
Promise.promisifyAll(mongoskin);
Run Code Online (Sandbox Code Playgroud)

此操作只需在应用程序中的一处完成一次,而不是在应用程序代码中的任何地方完成。

之后,您只需正常使用除 Async 后缀之外的方法,并且不传递回调:

req.db.collection('users').find().toArrayAsync()
  .then(function(doc) {
    if (doc) {
      return req.db.collection('users').find().toArrayAsync();
    }
  })
  .then(function(doc) {
    if (doc) {
      return req.db.collection('users').find().toArrayAsync();
    }
  })
  .then(function(doc) {
    if (doc) {
      return req.db.collection('users').find().toArrayAsync();
    }
  });
Run Code Online (Sandbox Code Playgroud)

再说一次,如果你调用像这样的函数

foo(a, b, c, function(err, result) {
    if (err) return console.log(err);
    //Code
});
Run Code Online (Sandbox Code Playgroud)

承诺返回版本的调用方式如下:

fooAsync(a, b, c).then(...)
Run Code Online (Sandbox Code Playgroud)

(未捕获的错误会自动记录,因此如果您只想记录它,则无需检查它们)