Mongoose 内置了对 promises 的支持 。在 Mongoose 5 中,异步操作如 .save()
和 .find().exec()
返回一个Promise,除非 您通过回调。
const Model = mongoose.model(Test, Schema({
name: String
}));
const doc = new Model({ name: Neo });
const promise = doc.save();
promise instanceof Promise; // true
const res = doc.save(function callback(err) {
/*...*/
});
res; // undefined
mongoose.Promise
Mongoose 有一个 Promise
属性 来设置 Mongoose 使用的 Promise 库。 例如您可以让 Mongoose 使用流行的 Bluebird Promise 库 :
const Bluebird = require(bluebird);
// Make Mongoose use Bluebird instead of built-in promises.
mongoose.Promise = Bluebird;
const doc = new Model({ name: Neo });
const promise = doc.save();
promise instanceof Promise; // false
promise instanceof Bluebird; // true
如果您尚未升级到 Mongoose 5,您可能会在 Mongoose 4.x 中看到以下弃用警告:
WARNING: Mongoose: mpromise (mongooses default promise library) is deprecated, plug in your own promise library instead
要解决该弃用警告,您将添加以下代码:
mongoose.Promise = global.Promise;
这是因为 Mongoose 5 的重大变化之一是改用 Node.js 的原生 Promise。 Mongoose 4 在 ES6 之前发布,所以它有自己的 Promise 实现,与原生 JavaScript 的 Promise。
如果你看到 mongoose.Promise = global.Promise
在使用 Mongoose 5 的代码中,请删除它。 Mongoose 5 默认使用原生 Promise,因此代码在 Mongoose 5 中什么也不做。
查询不是 Promise
尽管 save()
返回一个 Promise,像 Mongoose 的 find()
返回一只 Mongoose Query
。
const query = Model.find();
query instanceof Promise; // false
query instanceof mongoose.Query; // true
Mongoose 查询是 thenables。换句话说,查询有一个 then()
函数 行为类似于 Promise then()
功能 。 因此您可以使用带有 Promise 链接 和 async/await。
// Using queries with promise chaining
Model.findOne({ name: Mr. Anderson }).
then(doc => Model.updateOne({ _id: doc._id }, { name: Neo })).
then(() => Model.findOne({ name: Neo })).
then(doc => console.log(doc.name)); // Neo
// Using queries with async/await
const doc = await Model.findOne({ name: Neo });
console.log(doc.name); // Neo
请登录后查看评论内容