(नोड: 3341) निक्षेपागार: मानगो: मप्र


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

ड्राइवर, ड्राइवर वर्ग का एक उदाहरण है

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 के लेखक का कहना है कि: "बस करो mongoose.Promise = global.Promiseऔर तुम्हें अब वह चेतावनी नहीं मिलनी चाहिए।" github.com/Automattic/mongoose/issues/…
efkan

जवाबों:


240

डॉक्स पढ़ने के बाद, इस मुद्दे को स्पष्ट करने के लिए मैंने क्या काम किया: http://mongoosejs.com/docs/promises.html

दस्तावेज़ में उदाहरण ब्लूबर्ड वादा पुस्तकालय का उपयोग कर रहा है, लेकिन मैंने देशी ईएस 6 वादों के साथ जाना चुना।

फ़ाइल में जहाँ मैं कॉल कर रहा हूँ mongoose.connect:

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

[संपादित करें: मेरे उत्तर में एक प्रदर्शन दोष लाने के लिए @SylonZero को धन्यवाद। चूंकि यह उत्तर बहुत देखा जाता है, इसलिए मुझे इस संपादन को बनाने और bluebirdमूल वादों के बजाय इसके उपयोग को प्रोत्साहित करने के लिए कर्तव्य की भावना महसूस होती है। अधिक शिक्षित और अनुभवी विवरण के लिए कृपया नीचे दिए गए उत्तर को पढ़ें। ]


3
वेबसाइट पर बेंचमार्क की पुष्टि करने के बाद: bluebirdjs.com/docs/benchmarks.html @SylonZero का हवाला दे रहा हूं, मेरा मानना ​​है कि पहले प्रस्ताव के बजाय वोट के लायक उसका समाधान। मैं अब भी हंटर लेस्टर को इस महान कार्य और जांच और उनके निष्कर्षों को साझा करने के लिए धन्यवाद देता हूं!
इसाक ला फ्लूर

आपके संपादन के लिए धन्यवाद, जो मुझे एक विशाल प्रदर्शन दोष का एहसास कराता है
युसुफ कामिल AK

71

हालांकि, इसका उत्तर सटीक है और काम करता है, यदि आपको वास्तविक, उत्पादन नोड ऐप है, तो आपको प्रदर्शन के मुद्दे पर ध्यान देना होगा ।

उपरोक्त समाधान देशी ES6 वादों का उपयोग करेगा - जो मैंने नीचे साझा किए गए बेंचमार्क में ब्लूबर्ड की तुलना में 4X धीमी हैं। यह नाटकीय रूप से Node में लिखे गए API के प्रदर्शन और MongoDB का उपयोग करने को प्रभावित कर सकता है।

मैं ब्लूबर्ड का उपयोग करने की सलाह देता हूं:

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

बेंचमार्क परिणाम

प्लेटफ़ॉर्म: (लेखन के समय नवीनतम नोड का उपयोग करना)

  • लिनक्स 4.4.0-59-जेनेरिक x64
  • नोड.जेएस 6.9.4
  • V8 5.1.281.89
  • इंटेल (R) कोर (TM) i7-6500U CPU @ 2.50GHz × 4
  • 500 जीबी एसएसडी के साथ 16 जीबी रैम

    | 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 वादे के जवाब के लिए मतदान कर रहा है, लेकिन मैं आपके द्वारा बताए गए प्रदर्शन के मुद्दों में गहराई से खुदाई करना चाहूंगा।
ज़ेडेनम

1
बेंचमार्क परीक्षणों के एक सूट से है जिसे आप ब्लूबर्ड गिट रेपो से पढ़ सकते हैं (और पशु चिकित्सक) - मैंने उन्हें फिर से परिणाम प्राप्त करने के लिए स्थानीय रूप से फिर से चलाया क्योंकि मुझे दूसरों के साथ साझा करने के लिए 2017 परिणामों की आवश्यकता थी। इससे भी महत्वपूर्ण बात, मैंने अपने स्वयं के एपीआई में प्रदर्शन का लाभ प्राप्त किया है (मेरे पास 5 माइक्रो सेवाओं और एक कठिन स्केलेबिलिटी लक्ष्य है) और अक्सर वादों पर सरल नेस्टेड कॉलबैक का उपयोग करने के निर्णय लेने पड़ते हैं (अभी भी सबसे तेज)। मुझे व्यक्तिगत रूप से लगता है कि बेंचमार्क केवल एक निर्णय की दिशा में पहला कदम है, लेकिन मैं अभी तक अपने आंतरिक डेटा को साझा नहीं कर सकता ... मेरे पैमाने का लक्ष्य 10K उपयोगकर्ता हैं जो अपनी भौतिक मशीन पर हैं।
सोंलिज़ेरो

इसके अलावा, उत्थान शायद ही एक जवाब के बारे में एक पूर्ण उपाय है। मेरे अनुभव में, किसी समस्या के हल होने के बाद बहुत कम ही खुदाई की जाती है (या कुछ और पढ़ा जाता है) और कई प्रोग्रामर जिन्हें मैंने अतीत में सलाह दी है कि कोड के लिए प्रदर्शन और इंस्ट्रूमेंटेशन कौशल के बारे में सिखाया जाना चाहिए।
सोंलिज़ेरो

प्रदर्शन के मुद्दों को लाने के लिए बहुत-बहुत धन्यवाद। मैं नौसिखिया प्रोग्रामर हूं, इस पर केवल 2 साल, और इस शिक्षा को तरस रहा हूं। मैं उत्पादन में इसका उपयोग कर रहा हूं, इसलिए मुझे यह जानकर और भी अधिक खुशी हो रही है। बेंचमार्किंग कार्यक्रमों और कोड के टुकड़ों के बारे में जाने के सबसे अच्छे तरीके क्या हैं?
हंटर लेस्टर

1
हंटर, जो प्लेटफ़ॉर्म की प्रकृति और कोड पर निर्भर करेगा लेकिन इस प्रश्न से संबंधित है: अंतर्दृष्टि प्राप्त करने के लिए दो पक्ष हैं - 1. उपयोगकर्ता के अनुरोधों का अनुकरण करने के लिए लोड जनरेटर के माध्यम से उपयोग करने के लिए अच्छे परीक्षण। मैं अपने नोड एपीआई का परीक्षण करने और कई उपयोगकर्ताओं के लिए लोड उत्पन्न करने के लिए Apache jMeter का उपयोग करता हूं। 2. इंस्ट्रूमेंटेशन: आप व्यक्तिगत लेनदेन को कैसे ट्रैक करते हैं। मैं अपना नोड कोड लिखवाने के लिए NewRelic का उपयोग करता हूं - यह एमएस में हर लेनदेन का एक विस्तृत ब्रेकडाउन देता है (एक्सप्रेस मार्ग के नीचे, मैंगो क्वेरी समय, सत्रों के लिए रेडिस)। आशा है कि यह आप शुरू हो जाएगा।
सिलोनजेरो

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

मोंगोस के नवीनतम संस्करण में वादे की सहायता से कनेक्शन की आवश्यकता है [यह लिंक है] [१] [१]: http://mongoosejs.com/docs/promises.html


0

कनेक्ट () विधि के ऑब्जेक्ट के रूप में बस दूसरा पैरामीटर जोड़ें।

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

देखें: http://mongoosejs.com/docs/connections.html#use-mongo-client


यह अकेले चेतावनी को दूर नहीं करता है। जैसा कि ऊपर बताया गया है, हमें वैश्विक वादे को भी पूरा करना होगा।
बालसुब्रमणि M

0

मोंगोज 4.8.6

यदि आप इस तरह त्रुटि पकड़ते हैं:

(नोड: 9600) DeprecationWarning: नेवला: mpromise (नेवला के डिफ़ॉल्ट वादा पुस्तकालय) हटाई गई है, इसके बजाय अपने स्वयं वादा पुस्तकालय में प्लग: http://mongoosejs.com/docs/promises.html

आपको उन विकल्पों को भी सेट करने की आवश्यकता है जो ड्राइवर के लिए लाइब्रेरी का उपयोग करने का वादा करते हैं।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.