(node: 3341) Deprecation Cảnh báo: Mongoose: mpromise


89

Tôi đang cố gắng phát triển một lớp trên cùng của mongoose với các phương thức tùy chỉnh của mình, vì vậy tôi đã mở rộng mongoose với lớp của riêng mình nhưng khi tôi gọi để tạo một phương thức ô tô mới, nó hoạt động nhưng dải và lỗi của nó, ở đây tôi để bạn xem những gì tôi đang cố gắng làm.

Tôi nhận được cảnh báo này

(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

sau khi tôi làm

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

trình điều khiển là một thể hiện của lớp Trình điều khiển

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

bất kỳ suy nghĩ về những gì tôi làm sai?


3
Nhà văn của Mongoose nói rằng: "Chỉ cần làm mongoose.Promise = global.Promisevà bạn sẽ không nhận được cảnh báo đó nữa." github.com/Automattic/mongoose/issues/…
efkan

Câu trả lời:


240

Đây là cách giúp tôi giải quyết vấn đề sau khi đọc tài liệu: http://mongoosejs.com/docs/promises.html

Ví dụ trong tài liệu đang sử dụng thư viện lời hứa bluebird nhưng tôi đã chọn sử dụng các lời hứa ES6 bản địa.

Trong tệp mà tôi đang gọi mongoose.connect:

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

[EDIT: Cảm ơn @SylonZero đã đưa ra một lỗi hiệu suất trong câu trả lời của tôi. Vì câu trả lời này được xem rất nhiều, tôi cảm thấy có trách nhiệm phải thực hiện chỉnh sửa này và khuyến khích sử dụng bluebirdthay cho lời hứa ban đầu. Vui lòng đọc câu trả lời bên dưới câu trả lời này để biết thêm chi tiết. ]


3
Sau khi xác minh điểm chuẩn trên trang web: bluebirdjs.com/docs/benchmarks.html @SylonZero đang đề cập đến, tôi tin rằng giải pháp của anh ấy đáng để bỏ phiếu thay vì đề xuất đầu tiên. Tôi vẫn cảm ơn Hunter Lester vì công việc tuyệt vời này và cuộc điều tra cũng như chia sẻ những phát hiện của anh ấy!
Isak La Fleur

Cám ơn chỉnh sửa của bạn mà làm cho tôi nhận ra một lỗ hổng rất lớn hiệu suất
Yusuf Kamil AK

71

Mặc dù câu trả lời ở trên là chính xác và hoạt động, nhưng bạn phải tính đến vấn đề Hiệu suất nếu bạn có một ứng dụng Node thực, sản xuất.

Giải pháp trên sẽ sử dụng các hứa hẹn ES6 gốc - chậm hơn 4 lần so với bluebird trong các điểm chuẩn mà tôi đã chia sẻ bên dưới. Điều này có thể ảnh hưởng đáng kể đến hiệu suất của API được viết bằng Node và sử dụng MongoDB.

Tôi khuyên bạn nên sử dụng 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');

Kết quả điểm chuẩn

Nền tảng: (sử dụng Node mới nhất tại thời điểm viết bài)

  • Linux 4.4.0-59-chung x64
  • Node.JS 6.9.4
  • V8 5.1.281.89
  • CPU Intel (R) Core (TM) i7-6500U @ 2,50 GHz × 4
  • RAM 16 GB với ổ SSD 500 GB

    | 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
để tôi hiểu: điểm chuẩn của bạn đến từ đâu? Có sự đồng thuận xung quanh những kết quả này không? Có vẻ như mọi người đang bỏ phiếu cho câu trả lời hứa hẹn mặc định của ES6 nhưng tôi muốn tìm hiểu sâu hơn về các vấn đề hiệu suất mà bạn đề cập.
Zedenem

1
Điểm chuẩn là từ một bộ các bài kiểm tra mà bạn có thể đọc (và bác sĩ thú y) từ kho lưu trữ git bluebird - Tôi đã chạy lại chúng cục bộ để nhận kết quả ở trên vì tôi cần kết quả năm 2017 để chia sẻ với những người khác. Quan trọng hơn, tôi đã trải qua việc tăng hiệu suất trong API của riêng chúng tôi (tôi có 5 dịch vụ vi mô và một mục tiêu khả năng mở rộng khó khăn) và thường xuyên phải đưa ra quyết định sử dụng lệnh gọi lại lồng nhau đơn giản thay vì lời hứa (vẫn là nhanh nhất). Cá nhân tôi nghĩ rằng điểm chuẩn chỉ là bước đầu tiên để đưa ra quyết định nhưng tôi chưa thể chia sẻ dữ liệu nội bộ của mình ... mục tiêu quy mô của tôi là 10 nghìn người dùng trên mỗi máy vật lý.
SylonZero

Ngoài ra, sự ủng hộ khó có thể là thước đo đầy đủ về một câu trả lời. Theo kinh nghiệm của tôi, nhiều người hiếm khi đào sâu sau khi một vấn đề đã được giải quyết (hoặc đọc bất cứ điều gì khác) và nhiều lập trình viên mà tôi đã cố vấn trước đây cần được dạy về kỹ năng hiệu suất và thiết bị đo đạc cho mã.
SylonZero

Cảm ơn bạn rất nhiều vì đã đưa ra các vấn đề về hiệu suất. Tôi là một lập trình viên mới vào nghề, chỉ có 2 năm làm việc tại đó, và tôi khao khát được học tập. Tôi đang sử dụng cái này trong sản xuất, vì vậy tôi càng vui hơn khi biết nó. Cách tốt nhất để sử dụng các chương trình và đoạn mã điểm chuẩn là gì?
Hunter Lester

1
Hunter, điều đó sẽ phụ thuộc vào bản chất của nền tảng và mã nhưng liên quan đến câu hỏi này: có hai mặt để có được cái nhìn sâu sắc - 1. các thử nghiệm tốt để sử dụng thông qua trình tạo tải để mô phỏng yêu cầu của người dùng. Tôi sử dụng Apache jMeter để kiểm tra API Node của mình và tạo tải cho nhiều người dùng. 2. Công cụ: làm thế nào để bạn theo dõi các giao dịch riêng lẻ. Tôi sử dụng NewRelic để lập công cụ cho mã Node của mình - nó cung cấp bảng phân tích chi tiết về mọi giao dịch tính bằng mili giây (cho đến tuyến Express, thời gian truy vấn Mongo, Redis cho các phiên, v.v.). Hy vọng việc này có thể thúc đẩy bạn.
SylonZero

2

bạn đã thử cái này chưa Ví dụ :

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

nếu bạn tạo một mô hình từ một cá thể mongoose mà lời hứa của người đó không được xác định lại - mọi truy vấn trên mô hình này sẽ đưa ra cảnh báo.


2

Tôi nghĩ bạn đã có câu trả lời của mình nhưng tôi sử dụng global.promise với xử lý lỗi

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

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

Một người cần có kết nối với sự trợ giúp của lời hứa trong phiên bản mới nhất của mongoose [đây là liên kết] [1] [1]: http://mongoosejs.com/docs/promises.html



0

Mongoose 4.8.6

Nếu bạn gặp lỗi như thế này:

(node: 9600) DeprecationCảnh báo: Mongoose: mpromise (thư viện lời hứa mặc định của mongoose) không được dùng nữa, thay vào đó hãy cắm vào thư viện lời hứa của riêng bạn: http://mongoosejs.com/docs/promises.html

Bạn cũng cần thiết lập các tùy chọn hứa hẹn sử dụng thư viện cho trình điều khiển.

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

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

công việc này cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.