Mongoose async operations, like .save()
and queries, return thenables. This means that you can do things like MyModel.findOne({}).then()
and await MyModel.findOne({}).exec()
if you're using async/await.
You can find the return type of specific operations in the api docs
var gnr = new Band({ name: "Guns N' Roses", members: ['Axl', 'Slash'] }); var promise = gnr.save(); assert.ok(promise instanceof Promise); promise.then(function (doc) { assert.equal(doc.name, "Guns N' Roses"); });
Mongoose queries are not promises. They have a .then()
function for co and async/await as a convenience. If you need a fully-fledged promise, use the .exec()
function.
var query = Band.findOne({name: "Guns N' Roses"}); assert.ok(!(query instanceof Promise)); // A query is not a fully-fledged promise, but it does have a `.then()`. query.then(function (doc) { // use doc }); // `.exec()` gives you a fully-fledged promise var promise = query.exec(); assert.ok(promise instanceof Promise); promise.then(function (doc) { // use doc });
Although queries are not promises, queries are thenables. That means they have a .then()
function, so you can use queries as promises with either promise chaining or async await
Band.findOne({name: "Guns N' Roses"}).then(function(doc) { // use doc });
If you're an advanced user, you may want to plug in your own promise library like bluebird. Just set mongoose.Promise
to your favorite ES6-style promise constructor and mongoose will use it.
var query = Band.findOne({name: "Guns N' Roses"}); // Use bluebird mongoose.Promise = require('bluebird'); assert.equal(query.exec().constructor, require('bluebird')); // Use q. Note that you **must** use `require('q').Promise`. mongoose.Promise = require('q').Promise; assert.ok(query.exec() instanceof require('q').makePromise);
© 2010 LearnBoost
Licensed under the MIT License.
https://mongoosejs.com/docs/promises.html