내 사용자 지정 메서드를 사용하여 몽구스 위에 클래스를 개발하려고하므로 몽구스를 내 클래스로 확장했지만 새 자동차 메서드를 만들기 위해 호출하면 작동하지만 스트립과 오류가 발생합니다. 내가 뭘 하려는지보세요.
이 경고를 받고 있습니다.
(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;
}
}
내가 뭘 잘못하고 있는지에 대한 생각?
답변
문서를 읽은 후 문제를 해결하는 데 도움이 된 것은 다음과 같습니다.
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
네이티브 약속 대신 사용을 장려해야 할 의무감을 느낍니다 . 더 많은 교육을 받고 경험이 많은 세부 사항을 보려면이 답변 아래의 답변을 읽으십시오. ]
답변
위의 답변은 정확하고 효과가 있지만 성능 문제를 고려해야합니다. 하지만 실제 프로덕션 노드 앱이있는 경우 합니다.
위의 솔루션은 기본 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 |
답변
이거 해봤 어? 예 :
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
약속이 재정의되지 않은 몽구스 인스턴스에서 모델을 생성하면이 모델의 모든 쿼리가 경고를 표시합니다.
답변
답이 있다고 생각하지만 오류 처리와 함께 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);
});
답변
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
답변
두 번째 매개 변수를 connect () 메소드에 객체로 추가하기 만하면됩니다.
mongoose.connect('dbUrl', {
useMongoClient: true
});
참조 : http://mongoosejs.com/docs/connections.html#use-mongo-client
답변
몽구스 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 }})