(节点:3341)弃用警告:猫鼬:mpromise


89

我正在尝试使用自定义方法在猫鼬的顶部开发一个类,因此我用自己的类扩展了猫鼬,但是当我调用创建一个新的car方法时,它可以工作,但是它的剥离和错误,在这里我让你看看我要做什么。

我收到此警告

(node:3341) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html

我做完之后

driver.createCar({
      carName: 'jeep',
      availableSeats: 4,
    }, callback);

driver是Driver类的实例

const carSchema = new Schema({
  carName: String,
  availableSeats: Number,
  createdOn: { type: Date, default: Date.now },
});
const driverSchema = new Schema({
 email: String,
 name: String,
 city: String,
 phoneNumber: String,
 cars: [carSchema],
 userId: {
   type: Schema.Types.ObjectId,
   required: true,
 },
createdOn: { type: Date, default: Date.now },
});
const DriverModel = mongoose.model('Driver', driverSchema);

class Driver extends DriverModel {
  getCurrentDate() {
  return moment().format();
}
create(cb) {
  // save driver
  this.createdOn = this.getCurrentDate();
  this.save(cb);
}
remove(cb) {
  super.remove({
  _id: this._id,
 }, cb);
}
createCar(carData, cb) {
  this.cars.push(carData);
  this.save(cb);
}
getCars() {
  return this.cars;
 }
}

关于我在做什么错的任何想法?


3
猫鼬的作者说:“只要这样做mongoose.Promise = global.Promise,您就不会再收到该警告了。” github.com/Automattic/mongoose/issues/…–
efkan

Answers:


240

阅读文档后,这对我来说是解决问题的方法:http : //mongoosejs.com/docs/promises.html

该文档中的示例使用的是bluebird Promise库,但我选择使用本机ES6 Promise。

在我要呼叫的档案中mongoose.connect

mongoose.Promise = global.Promise;
mongoose.connect('mongodb://10.7.0.3:27107/data/db');

[编辑:感谢@SylonZero在我的回答中提出了性能缺陷。由于人们对这个答案的看法如此之高,因此我感到有责任进行编辑并鼓励使用bluebird诺言而不是本机诺言。请阅读此答案下面的答案,以了解更多受过教育的和有经验的详细信息。]


3
在网站上验证了基准之后:bluebirdjs.com/docs/benchmarks.html @SylonZero所指的是,我相信他的解决方案值得投票,而不是第一个建议。我仍然感谢Hunter Lester所做的出色工作和调查,并分享了他的发现!
Isak La Fleur

感谢您的修改,这使我意识到了巨大的性能缺陷
Yusuf Kamil AK

71

尽管上面的答案是正确的并且可行,但是如果您有一个真正的生产节点应用程序,则必须考虑性能问题。

上面的解决方案将使用本机ES6承诺- 在我下面共享的基准测试中,蓝鸟的速度比蓝鸟慢4倍。这可能会极大地影响用Node和MongoDB编写的API的性能。

我建议使用Bluebird:

// Assuming you store the library in a var called mongoose
var mongoose = require('mongoose');

// Just add bluebird to your package.json, and then the following line should work
mongoose.Promise = require('bluebird');

基准结果

平台:(在撰写本文时使用最新的Node)

  • Linux 4.4.0-59-通用x64
  • Node.JS 6.9.4
  • V8 5.1.281.89
  • 英特尔®酷睿TM i7-6500U CPU @ 2.50GHz×4
  • 16 GB RAM和500 GB SSD

    | file                                      | time(ms) | memory(MB) |
    |-------------------------------------------|----------|------------|
    | callbacks-baseline.js                     | 114      | 25.09      |
    | callbacks-suguru03-neo-async-waterfall.js | 152      | 32.98      |
    | promises-bluebird-generator.js            | 208      | 29.89      |
    | promises-bluebird.js                      | 223      | 45.47      |
    | promises-cujojs-when.js                   | 320      | 58.11      |
    | promises-then-promise.js                  | 327      | 64.51      |
    | promises-tildeio-rsvp.js                  | 387      | 85.17      |
    | promises-lvivski-davy.js                  | 396      | 81.18      |
    | callbacks-caolan-async-waterfall.js       | 527      | 97.45      |
    | promises-dfilatov-vow.js                  | 593      | 148.30     |
    | promises-calvinmetcalf-lie.js             | 666      | 122.78     |
    | generators-tj-co.js                       | 885      | 121.71     |
    | promises-obvious-kew.js                   | 920      | 216.08     |
    | promises-ecmascript6-native.js            | 931      | 184.90     |
    | promises-medikoo-deferred.js              | 1412     | 158.38     |
    | streamline-generators.js                  | 1695     | 175.84     |
    | observables-Reactive-Extensions-RxJS.js   | 1739     | 218.96     |
    | streamline-callbacks.js                   | 2668     | 248.61     |
    | promises-kriskowal-q.js                   | 9889     | 410.96     |
    | observables-baconjs-bacon.js.js           | 21636    | 799.09     |
    | observables-pozadi-kefir.js               | 51601    | 151.29     |
    | observables-caolan-highland.js            | 134113   | 387.07     |

1
据我了解:您的基准来自哪里?关于这些结果是否达成共识?似乎每个人都在投票赞成默认的ES6 Promise答案,但我想更深入地探讨您提到的性能问题。
Zedenem

1
该基准来自一系列测试,您可以从蓝鸟git repo中读取(和审核)-我再次在本地运行它们以获取上述结果,因为我需要2017年的结果与他人共享。更重要的是,我已经在自己的API中获得了性能提升(我拥有5个微服务和一个严格的可扩展性目标),并且不得不经常做出使用简单嵌套回调而不是promise的决定(仍然是最快的)。我个人认为基准测试只是决策的第一步,但我还不能共享我的内部数据...我的扩展目标是每台物理机1万用户。
SylonZero'2

而且,投票几乎不能完全解决问题。以我的经验,解决问题(或阅读其他任何东西)后,许多人很少深入研究,而我过去曾指导过的许多程序员需要学习有关代码的性能和检测技能的知识。
SylonZero'2

非常感谢您提出性能问题。我是一个新手程序员,只用了2年时间,就渴望接受这种教育。我在生产中使用了它,所以我很高兴知道是否需要它。基准测试程序和代码段的最佳方法是什么?
猎人莱斯特

1
Hunter,这将取决于平台和代码的性质,但与此问题相关:获得洞察力有两个方面-1.可以通过负载生成器使用的良好测试来模拟用户请求。我使用Apache jMeter测试我的Node API并为多个用户生成负载。2.工具:如何跟踪单个交易。我使用NewRelic来检测我的Node代码-它以ms为单位提供了每个事务的详细细分(包括Express路由,Mongo查询时间,会话的Redis等)。希望这可以帮助您入门。
SylonZero'2

2

你有尝试过吗?例如 :

const mongoose = require('mongoose')
mongoose.Promise = global.Promise // <--
const Schema = mongoose.Schema
const UserSchema = new Schema({
  name: String,
})
const User = mongoose.model('user', UserSchema)
module.exports = User

如果您从没有重新定义诺言的猫鼬实例创建模型-该模型上的每个查询都会引发警告。


2

我认为您有答案,但我将global.promise与错误处理配合使用

// MongoDB connection
mongoose.Promise = global.Promise;

var promise = mongoose.connect('mongodb://localhost:27017/test_db', {
  useMongoClient: true,
});

promise.then(function(db) {
    console.log("Connected to database!!!");
}, function(err){
    console.log("Error in connecting database " + err);
});



0

猫鼬4.8.6

如果您发现这样的错误:

(节点:9600)不建议使用警告:猫鼬:mpromise(猫鼬的默认诺言库),请插入您自己的诺言库:http ://mongoosejs.com/docs/promises.html

您还需要设置选项,以使驱动程序可以使用库。

mongoose.Promise = global.Promise
mongoose.connect(uri, { useMongoClient: true, options: { promiseLibrary: mongoose.Promise }})

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.