(节点: 3341)弃权警告: 猫鼬: 伪善

我试图用我的自定义方法在猫鼬的顶部开发一个类所以我用我自己的类扩展了猫鼬但是当我调用创建一个新的 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 类的实例

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

有没有想过我做错了什么?

58388 次浏览

Here's what worked for me to clear up the issue, after reading docs: http://mongoosejs.com/docs/promises.html

The example in the doc is using the bluebird promise library but I chose to go with native ES6 promises.

In the file where I'm calling mongoose.connect:

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

[EDIT: Thanks to @SylonZero for bringing up a performance flaw in my answer. Since this answer is so greatly viewed, I feel a sense of duty to make this edit and to encourage the use of bluebird instead of native promises. Please read the answer below this one for more educated and experienced details. ]

While the answer above is accurate and works, you have to account for the issue of Performance if you have a real, production Node app.

The solution above will use native ES6 promises - which are 4X slower than bluebird in the benchmarks I've shared below. This could dramatically affect the performance of an API written in Node and using MongoDB.

I recommend using 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');

Benchmark Results

Platform: (using latest Node at time of writing)

  • 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
  • 16 GB RAM with 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     |

did you try this? For Example :

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

if you create a model from a mongoose instance who's promise wasn't redefined - every query on this model would throw the warning.

Just add the second parameter as an object to the connect() method.

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

See: http://mongoosejs.com/docs/connections.html#use-mongo-client

I think you have your answer but I use global.promise with error handling

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

Mongoose 4.8.6

If you catch error like this:

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

You need also to set in options which promise library to use for the driver.

mongoose.Promise = global.Promise
mongoose.connect(uri, { useMongoClient: true, options: { promiseLibrary: mongoose.Promise }})
var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
db = mongoose.connect(env.DATABASE_URI, function(){
//
})

this work for me.

var mydb;
var uri = 'mongodb://localhost/user1';
var promise = mongooose.connect(uri,{
useMongoClient: true,
});
promise.openUri(uri,function(errr,db){
if(errr){
throw errr;
}else{
console.log("Connection Successfull");
mydb = db;
}
});

One needs to have connection with the help of promise in the latest version of mongoose [this is the link][1] [1]: http://mongoosejs.com/docs/promises.html