Mongoose 中的 Promises 介绍
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 (mongoose's 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'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论