(node:3341)DeprecationWarning:Mongoose:mpromise

我是三年前在我的自定义方法上开发mongoose顶部的类,所以我用自己的类扩展mongoose,但是当我调用创build一个新的汽车方法,它的作品,但它的脱衣舞和错误,在这里,我让你看看我正在努力。

我得到这个警告

(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类的一个实例

 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; } } 

任何想什么我做错了?

阅读文档后,以下是清除问题的工具: http : //mongoosejs.com/docs/promises.html

在文档中的例子是使用蓝鸟承诺库,但我select了本土ES6的承诺。

在我打电话给mongoose.connect的文件中:

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

[编辑:感谢@SylonZero提出了我的答案性能缺陷。 既然这个答案如此受到重视,我觉得有责任做这个编辑,并鼓励使用bluebird而不是原生的承诺。 请阅读下面的答案,以获得更多的教育和经验细节。 ]

尽pipe上面的答案是准确的并且有效,但是如果您有一个真实的生产Node应用程序,则必须考虑性能问题。

上面的解决scheme将使用原生ES6承诺 – 这比我在下面分享的基准testing中的蓝鸟要慢4倍 。 这可能会极大地影响Node中编写的API和使用MongoDb的性能。

我build议使用蓝鸟:

 // 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'); 

基准testing结果

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

  • Linux 4.4.0-59-generic x64
  • Node.JS 6.9.4
  • V8 5.1.281.89
  • Intel(R)Core(TM)i7-6500U CPU @ 2.50GHz×4
  • 具有500 GB SSD的16 GB RAM

  | 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 | 

你试过这个吗? 例如 :

 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 

如果你从一个mongoose实例创build了一个模型,而这个模型的promise没有被重新定义,那么这个模型上的每个查询都会抛出警告。

只需将第二个参数作为对象添加到connect()方法即可。

 mongoose.connect('dbUrl', { useMongoClient: true }); 

请参阅: http : //mongoosejs.com/docs/connections.html#use-mongo-client