現行の Mongoose 4.2.4 ではネイティブ Promise がサポートされていない。Query オブジェクトの exec メソッドを引数無しで呼び出すと、Mongoose 独自の Promise が返るがチェインの中で利用すると上手く動かなかった。
[http://mongoosejs.com/docs/api.html#promise_Promise]
リンク先に Mongoose 5.0 でネイティブ Promise がサポートされるとあるが今使いたい。そこで Query オブジェクトに execPromise メソッドを拡張実装してみる。
1 2 3 4 5 6 7 8 9 10 11
| var mongoose = require('mongoose');
mongoose.Query.prototype.execPromise = function() { var self = this; return new Promise(function(resolve, reject){ self.exec(function(err, data){ if (err) reject(err); else resolve(data); }); }); }
|
以下のようにチェインで使うことができる。
1 2 3 4 5 6 7 8 9 10 11 12
| var promise = Article.find({ id: 1 }).execPromise();
promise.then(function(article){ return Author.find({ id: article.author }).exePromise(); }) .then(function(author){ console.log(author); }) .catch(function(err){ console.log(err); });
|
tilfin
freelance software engineer