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

时间:2016-07-01 06:25:28

标签: node.js mongodb mongoose

我正在尝试使用我的自定义方法在猫鼬的顶部开发一个类,所以我用我自己的类扩展了猫鼬但是当我调用创建一个新的汽车方法它可以工作但它的条带和错误,这里我让你看看我想做什么。

我收到了这个警告

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

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

8 个答案:

答案 0 :(得分:233)

在阅读完docs之后,以下是解决问题的方法: http://mongoosejs.com/docs/promises.html

doc中的示例是使用bluebird promise库,但我选择使用本机ES6承诺。

在我调用mongoose.connect的文件中:

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

[编辑:感谢@SylonZero在我的回答中提出了一个性能缺陷。由于这个答案被大大地看待,我觉得有责任进行编辑并鼓励使用bluebird而不是原生承诺。请阅读下面的答案,了解更多有经验和有经验的细节。 ]

答案 1 :(得分:68)

虽然上面的答案是准确无误的,但如果你有一个真实的生产节点应用,你必须考虑性能的问题。

上面的解决方案将使用原生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');

基准测试结果

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

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

答案 2 :(得分:2)

你试过这个吗? 例如:

string consentGiven = ConsentGivenDate.Text;
DateTime date1 = Convert.ToDateTime(consentGiven);
cmd.Parameters.Add(new SqlParameter("@ConsentGivenDate", date1));

if ((ConsentGivenDate.Text == "dd/mm/yyyy"))
    cmd.Parameters.Add("@ConsentGivenDate", SqlDbType.DateTime).Value = DBNull.Value;
else
    cmd.Parameters.Add("@ConsentGivenDate", SqlDbType.DateTime).Value = ConsentGivenDate.Text;

如果你从一个mongoose实例中创建了一个模型,而该模型的承诺没有被重新定义 - 这个模型上的每个查询都会抛出警告。

答案 3 :(得分:1)

zmq_pollitem_t

在最新版本的mongoose中需要与promise的帮助有联系[这是链接] [1]       [1]:http://mongoosejs.com/docs/promises.html

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

我认为您有答案,但我使用 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);
});

答案 6 :(得分:0)

猫鼬4.8.6

如果你发现这样的错误:

  

(node:9600)DeprecationWarning:Mongoose:mpromise(mongoose的默认值)   promise library)已弃用,请插入您自己的promise库   相反:http://mongoosejs.com/docs/promises.html

您还需要设置承诺库用于驱动程序的选项。

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

答案 7 :(得分:0)

var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
db = mongoose.connect(env.DATABASE_URI, function(){
  //
})

这项工作对我而言。