猫鼬 - 为什么我们在设置猫鼬模块时会制作"mongoose.Promise = global.Promise"?

Web*_*man 22 javascript mongoose node.js

我和Mongoose一起工作.我见过很多开发人员发出以下命令:

mongoose.Promise = global.Promise;
Run Code Online (Sandbox Code Playgroud)

然后我很好奇,看看它的原始价值是什么mongoose.Promise.我在编辑器中输入了以下命令:

const mongoose = require("mongoose");

console.log("promise: ", mongoose.Promise);
Run Code Online (Sandbox Code Playgroud)

我的控制台回复了我:

promise:函数Promise(){[native code]}

好的,那么为什么要发出命令,mongoose.Promise = global.Promise因为Mongoose的承诺已经返回了本机代码?我不明白这一点,如果有人能帮我们理解,会很棒,

谢谢

Est*_*ask 31

这是Mongoose 5不需要的旧示例的遗留代码.

Mongoose 4依靠自己的承诺实施,mpromise.mongoose.Promise不一定是Promise全球性的.

正如Mongoose 4文档所述:

默认情况下,Mongoose 5.0将使用本机承诺(或者如果不存在本机承诺,则使用bluebird),但仍支持插入自己的ES6兼容的promises库.Mongoose 5.0不支持mpromise.

虽然关于蓝鸟的声明已不再适用; Mongoose 5放弃了没有本机承诺的Node版本的支持.

mongoose.Promise = global.Promise;
Run Code Online (Sandbox Code Playgroud)

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

  • 只是为了确认,我们不需要使用`mongoose.promise = global.promise`?我们可以使用原生承诺吗?另外,根据本地承诺,您的意思是.then,promise,promise.all? (4认同)
  • 是的,我们不需要它。其他promise实现也可能具有兼容的方法。原生承诺是指model.save(...)返回Promise的实例。 (4认同)

vka*_*v15 19

猫鼬维护者在这里。如果您使用的是 Mongoose 5,请删除mongoose.Promise = global.Promise;. 该行用于在 Mongoose 4 中通过promise解决以下弃用警告:

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

It does nothing in Mongoose 5. You should only use mongoose.Promise in Mongoose 5 if you want to use your own promise library with Mongoose, like Bluebird or Q.

There's also a little more about mongoose.Promise here: https://masteringjs.io/tutorials/mongoose/promise#the-mongoosepromise-property