(node ​​: 3341) DeprecationWarning : Mongoose : mpromise


89

내 사용자 지정 메서드를 사용하여 몽구스 위에 클래스를 개발하려고하므로 몽구스를 내 클래스로 확장했지만 새 자동차 메서드를 만들기 위해 호출하면 작동하지만 스트립과 오류가 발생합니다. 내가 뭘 하려는지보세요.

이 경고를 받고 있습니다.

(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

답변:


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
웹 사이트에서 벤치 마크를 확인한 후 : @SylonZero가 언급 bluebirdjs.com/docs/benchmarks.html 첫 번째 제안 대신 투표 할 가치가 있다고 생각합니다. 저는 여전히이 위대한 업적과 조사에 대해 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');

벤치 마크 결과

플랫폼 : (작성 당시 최신 노드 사용)

  • Linux 4.4.0-59- 일반 x64
  • Node.JS 6.9.4
  • V8 5.1.281.89
  • Intel (R) Core (TM) i7-6500U CPU @ 2.50GHz × 4
  • 16GB RAM (500GB 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 약속 답변에 투표하는 것처럼 보이지만 언급 한 성능 문제에 대해 자세히 알아보고 싶습니다.
— Zedenem

1
벤치 마크는 bluebird git repo에서 읽을 수있는 (및 수의) 테스트 모음에서 나왔습니다. 다른 사람들과 공유 할 2017 결과가 필요했기 때문에 위의 결과를 얻기 위해 로컬에서 다시 실행했습니다. 더 중요한 것은 자체 API에서 성능 향상을 경험했으며 (5 개의 마이크로 서비스와 엄격한 확장 성 목표가 있음) 약속보다 간단한 중첩 콜백을 사용하기 위해 종종 결정을 내려야했습니다 (여전히 가장 빠름). 개인적으로 벤치 마크는 결정을 향한 첫 번째 단계 일 뿐이라고 생각하지만 아직 내부 데이터를 공유 할 수는 없습니다 ... 제 규모 목표는 물리적 머신 당 10,000 명의 사용자입니다.
— SylonZero

또한 찬성 투표는 답변에 대한 완전한 척도가 아닙니다. 제 경험상 많은 사람들이 문제가 해결 된 후 (또는 다른 것을 읽은 후) 깊이 파헤치는 경우가 거의 없으며 과거에 제가 멘토링 한 많은 프로그래머는 코드에 대한 성능 및 계측 기술에 대해 가르쳐야했습니다.
— SylonZero

성능 문제를 제기 해 주셔서 감사합니다. 저는 초보 프로그래머로 2 년 밖에되지 않았고이 교육을 갈망합니다. 나는 이것을 프로덕션에 사용하고 있기 때문에 그것이 있는지 알게되어 더욱 기쁩니다. 벤치마킹 프로그램과 코드 조각에 대해 가장 좋은 방법은 무엇입니까?
— Hunter Lester

1
Hunter는 플랫폼 및 코드의 특성에 따라 다르지만이 질문과 관련이 있습니다. 통찰력을 얻는 데는 두 가지 측면이 있습니다. 1. 사용자 요청을 시뮬레이션하기 위해로드 생성기를 통해 사용할 좋은 테스트. Apache jMeter를 사용하여 Node API를 테스트하고 여러 사용자에 대한 부하를 생성합니다. 2. 계측 : 개별 거래를 어떻게 추적합니까? 저는 NewRelic을 사용하여 노드 코드를 계측합니다. ms 단위로 모든 트랜잭션에 대한 자세한 분석을 제공합니다 (Express 경로, Mongo 쿼리 시간, 세션 용 Redis 등). 이것이 시작되기를 바랍니다.
— SylonZero

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

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

mongoose의 최신 버전에서 promise의 도움을 받아야합니다. [링크입니다] [1] [1] : http://mongoosejs.com/docs/promises.html



0

몽구스 4.8.6

다음과 같은 오류가 발생하면 :

(node ​​: 9600) DeprecationWarning : Mongoose : mpromise (mongoose의 기본 promise 라이브러리)는 더 이상 사용되지 않습니다. 대신 자신의 promise 라이브러리를 연결하십시오. http://mongoosejs.com/docs/promises.html

또한 드라이버에 사용할 라이브러리를 약속하는 옵션을 설정해야합니다.

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(){
  //
})

이것은 나를 위해 일합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.