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
© 版权声明
评论 抢沙发

请登录后发表评论