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