我正在和猫鼬一起工作。我已经看到很多开发人员执行以下命令:
mongoose.Promise = global.Promise;
那我很想知道mongoose.Promise
的原始值是多少。我在编辑器中输入了以下命令:
const mongoose = require("mongoose");
console.log("promise: ", mongoose.Promise);
我的控制台返回了我:
promise:函数Promise(){[native code]}
好的,既然猫鼬的诺言已经返回了本机代码,为什么还要执行命令mongoose.Promise = global.Promise
呢?我不明白要点,如果有人可以帮助我们理解,那就太好了,
谢谢
答案 0 :(得分:19)
这是Mongoose 5不需要的旧示例中的遗留代码。
猫鼬4依靠自己的诺言实现mpromise
。 mongoose.Promise
不一定是全局的Promise
。
猫鼬5.0将默认使用本机承诺(或蓝鸟, 如果没有本地承诺),但仍然 支持插入您自己的ES6兼容的promise库。猫鼬5.0 将不支持mpromise。
尽管有关Bluebird的陈述不再正确;猫鼬5放弃了对没有本地承诺的Node版本的支持。
mongoose.Promise = global.Promise;
如果在导入猫鼬之后为global.Promise
分配了另一个实现(例如Bluebird),可能仍然需要,尽管更好的办法是更早地分配global.Promise = Bluebird
。
答案 1 :(得分:9)
这里的猫鼬维护者。如果您使用的是Mongoose 5,请删除mongoose.Promise = global.Promise;
。该行用于通过promises in Mongoose 4处理以下弃用警告:
WARNING: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead
它在Mongoose 5中什么也不做。如果要对your own promise library与Mongoose一起使用https://masteringjs.io/tutorials/mongoose/promise#the-mongoosepromise-property,例如Bluebird或Q,则只应在Mongoose 5中使用mongoose.Promise
。
这里还有mongoose.Promise
的更多信息:@Joe Irby's answer
答案 2 :(得分:1)
如果我们想在代码内的不同位置使用猫鼬,则必须将其视为全局模式,这就是为什么我们需要将猫鼬设置为:
mongoose.Promise = global.Promise;
答案 3 :(得分:0)
我们只是在想连接到MongoDB数据库时使用过:
var mongoose = require('mongoose');
var mongoDB ='数据库URL';
mongoose.connect(mongoDB);
mongoose.Promise = global.Promise;
mongoose.connection.on('错误',console.error.bind(控制台,'MongoDB连接错误:'));
您需要创建架构并在
之后创建自己的模型答案 4 :(得分:0)
首先,猫鼬将Promise用于异步应用程序。在新版本中,可以是:
mongoose.connect("URL").then("what you need to happen after the connection is done").catch("when the error happened")
因此,在编写猫鼬时,我使用了promise和global在任何地方使用猫鼬作为异步。