猫鼬-为什么我们在设置猫鼬模块时使用“猫鼬。允诺 = 全局。允诺”?

我正在和 Mongoose 一起工作,我见过很多开发人员执行以下命令:

mongoose.Promise = global.Promise;

然后我很想知道 mongoose.Promise的原始值是多少。我在编辑器中输入了以下命令:

const mongoose = require("mongoose");


console.log("promise: ", mongoose.Promise);

我的控制台给了我:

{[本机代码]}

好吧,既然猫鼬的承诺已经返回了本机代码,为什么还要使用 mongoose.Promise = global.Promise命令呢?我不明白这有什么意义如果有人能帮我们理解就太好了,

谢谢

34290 次浏览

这是来自早期示例的遗留代码,Mongoose 5不需要这些代码。

猫鼬4依赖于它自己的承诺实现,mpromisemongoose.Promise不一定是 Promise全球性的。

正如 猫鼬4文档所说:

Mongoose 5.0将默认使用本机承诺(或者蓝鸟, 如果当地的承诺不存在) ,但仍然 支持插入您自己的 ES6兼容承诺库 不会支持妥协。

虽然关于 Bluebird 的说法不再正确; Mongoose 5放弃了对没有原生承诺的 Node 版本的支持。

mongoose.Promise = global.Promise;

如果在导入 Mongoose 之后为 global.Promise分配了另一个实现(例如 Bluebird) ,那么仍然可能需要 global.Promise,尽管更好的做法是更早地分配 global.Promise = Bluebird

如果我们想在代码的不同位置使用猫鼬,它必须被视为全局模式,这就是为什么我们需要将猫鼬设置为:

mongoose.Promise = global.Promise;

我们在想要连接到 MongoDB 数据库的时候使用:

var mongoose = require('mongoose');


var mongoDB = ' database url ';


mongoose.connect(mongoDB);


mongoose.Promise = global.Promise;


mongoose.connection.on('error',console.error.bind(console, 'MongoDB connection error:'));

您需要创建模式并在

首先,猫鼬使用的是“异步承诺”应用程序,在新版本中可以是:

mongoose.connect("URL").then("what you need to happen after the connection is done").catch("when the error happened")

因此,在编写猫鼬时,我使用了諾和 global 在任何地方使用猫鼬作为 Async。

我是猫鼬保养员。如果您正在使用猫鼬5,请删除 mongoose.Promise = global.Promise;。该行用于处理以下 《猫鼬4》中的承诺的弃用警告:

WARNING: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead

它在猫鼬5中什么都不做。如果您想在 Mongoose 中使用 你自己的承诺图书馆,比如 Bluebird 或 Q,那么应该只在 Mongoose 5中使用 mongoose.Promise

这里还有一些关于 mongoose.Promise的内容: https://masteringjs.io/tutorials/mongoose/promise#the-mongoosepromise-property