(নোড: 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;
 }
}

আমি কী ভুল করছি সে সম্পর্কে কোন চিন্তাভাবনা?


4
মঙ্গুজের লেখক বলেছেন: "ঠিক করুন mongoose.Promise = global.Promiseএবং আপনার সেই সতর্কতা আর পাওয়া উচিত নয়।" github.com
মমুজুস /

উত্তর:


240

দস্তাবেজগুলি পড়ার পরে, বিষয়টি মুছে ফেলার জন্য আমার পক্ষে কী কাজ করেছে তা এখানে: http://mongoosejs.com/docs/promises.html

দস্তাবেজের উদাহরণটি ব্লুবার্ড প্রতিশ্রুতি গ্রন্থাগারটি ব্যবহার করছে তবে আমি দেশীয় ES6 প্রতিশ্রুতি নিয়ে যেতে পছন্দ করেছি।

আমি যে ফাইলটিতে কল করছি mongoose.connect:

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

[সম্পাদনা: আমার উত্তরে একটি পারফরম্যান্স ত্রুটি এনে দেওয়ার জন্য @ সাইলন জিরোকে ধন্যবাদ যেহেতু এই উত্তরটি এত বেশি দেখা হয়েছে, তাই আমি এই সম্পাদনাটি করা এবং bluebirdদেশীয় প্রতিশ্রুতির পরিবর্তে এর ব্যবহারকে উত্সাহিত করার দায়িত্ব অনুভব করছি । আরও শিক্ষিত এবং অভিজ্ঞ বিশদ জন্য দয়া করে নীচের উত্তরটি পড়ুন। ]


4
ওয়েবসাইটে বেঞ্চমার্ক যাচাই করার পরে: ব্লুবার্ডজ / ডকস / বেঞ্চমার্কস html @ সাইলনজিরো উল্লেখ করছেন, আমি প্রথম প্রস্তাবের পরিবর্তে ভোট গ্রহণের পক্ষে তার সমাধানটিকে বিশ্বাস করি। আমি এখনও এই দুর্দান্ত কাজ এবং তদন্ত এবং তার অনুসন্ধানগুলি ভাগ করে নেওয়ার জন্য হান্টার লেস্টারকে ধন্যবাদ জানাই!
ইসাক লা ফ্লেউর

আপনার সম্পাদনার জন্য ধন্যবাদ যা আমাকে বিশাল পারফরম্যান্সের ত্রুটিটি উপলব্ধি করতে পেরেছে
ইউসুফ কামিল একে

72

উপরের উত্তরটি সঠিক এবং কাজ করার সময়, আপনার যদি সত্যিকারের, উত্পাদনের নোড অ্যাপ থাকে তবে আপনাকে পারফরম্যান্স ইস্যুর জন্য অ্যাকাউন্ট করতে হবে।

উপরের সমাধানটি নেটিভ ES6 প্রতিশ্রুতি ব্যবহার করবে - যা নীচে ভাগ করে দেওয়া বেনমার্কগুলিতে ব্লুবার্ডের চেয়ে 4X ধীর । এটি নোডে লিখিত এবং মঙ্গোডিবি ব্যবহার করে কোনও এপিআইয়ের সম্পাদনা নাটকীয়ভাবে প্রভাবিত করতে পারে।

আমি ব্লুবার্ড ব্যবহার করার পরামর্শ দিচ্ছি:

// 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
  • ভি 8 5.1.281.89
  • ইন্টেল (আর) কোর (টিএম) i7-6500U সিপিইউ @ 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     |

4
আমার বোঝার জন্য: আপনার মানদণ্ডটি কোথা থেকে আসছে? এই ফলাফলগুলি নিয়ে কি ?ক্যমত্য রয়েছে? দেখে মনে হচ্ছে সবাই ডিফল্ট ES6 প্রতিশ্রুতি উত্তরের পক্ষে ভোট দিচ্ছেন তবে আমি যে উল্লেখযোগ্য পারফরম্যান্স ইস্যুগুলি উল্লেখ করেছি তার মধ্যে আরও গভীর খনন করতে চাই।
জেডেনেম 16

4
মাপদণ্ডটি নীলবার্ড গিট রেপো থেকে আপনি (এবং ভেট) পড়তে পারেন এমন পরীক্ষার স্যুট থেকে - উপরের ফলাফলগুলি পেতে আমি আবার স্থানীয়ভাবে তাদের চালিয়েছি কারণ অন্যদের সাথে ভাগ করার জন্য আমার 2017 সালের ফলাফলের প্রয়োজন ছিল। আরও গুরুত্বপূর্ণভাবে, আমি আমাদের নিজস্ব এপিআইতে পারফরম্যান্স লাভের অভিজ্ঞতা পেয়েছি (আমার কাছে 5 টি মাইক্রো পরিষেবা রয়েছে এবং একটি শক্ত স্কেলিবিলিটি টার্গেট রয়েছে) এবং প্রায়শই প্রতিশ্রুতিগুলির তুলনায় সাধারণ নেস্টেড কলব্যাকগুলি ব্যবহার করার সিদ্ধান্ত নিতে হয়েছিল (এখনও দ্রুততম)। আমি ব্যক্তিগতভাবে মনে করি বেঞ্চমার্কগুলি কোনও সিদ্ধান্তের দিকে প্রথম পদক্ষেপ তবে আমি এখনও আমার অভ্যন্তরীণ তথ্য ভাগ করতে পারি না ... আমার স্কেল লক্ষ্য শারীরিক মেশিনে 10 কে ব্যবহারকারী।
সিলনজিরো

এছাড়াও, উত্তরটি উত্তর সম্পর্কে খুব কমই মাপেনি। আমার অভিজ্ঞতায়, সমস্যার সমাধান হওয়ার পরে (বা অন্য কোনও কিছু পড়ার জন্য) খুব কমই গভীর খনন করা হয় এবং অতীতে আমি যে সমস্ত প্রোগ্রামারদের পরামর্শ দিয়েছি তাদের কোডের জন্য পারফরম্যান্স এবং উপকরণ দক্ষতা সম্পর্কে শেখানো দরকার।
সিলোনজিরো

4
পারফরম্যান্স সমস্যা আনার জন্য আপনাকে অনেক ধন্যবাদ। আমি একজন শিক্ষানবিস প্রোগ্রামার, এটির জন্য মাত্র 2 বছর, এবং এই শিক্ষার আগ্রহী। আমি এটি প্রযোজনায় ব্যবহার করছি, তাই আমি এটির চেয়ে আরও বেশি আনন্দিত। বেঞ্চমার্কিং প্রোগ্রামগুলি এবং কোডের টুকরা সম্পর্কে জানার সেরা উপায়গুলি কী?
হান্টার লেস্টার

4
হান্টার, এটি প্ল্যাটফর্ম এবং কোডের প্রকৃতির উপর নির্ভর করবে তবে এই প্রশ্নের সাথে সম্পর্কিত: অন্তর্দৃষ্টি পাওয়ার দুটি দিক রয়েছে - ১. ব্যবহারকারীদের অনুরোধগুলি অনুকরণ করার জন্য লোড জেনারেটরের মাধ্যমে ব্যবহারের জন্য ভাল পরীক্ষা। আমি আমার নোড এপিআই পরীক্ষা করতে এবং একাধিক ব্যবহারকারীর জন্য লোড উত্পন্ন করতে অ্যাপাচি জেমেটার ব্যবহার করি। ২. ইনস্ট্রুমেন্টেশন: আপনি ব্যক্তিগত লেনদেনগুলি কীভাবে ট্র্যাক করবেন। আমি আমার নোড কোডটি ইনস্ট্রুমেন্ট করার জন্য নিউরেলিক ব্যবহার করি - এটি এমএসে প্রতিটি লেনদেনের একটি বিশদ বিস্তৃতি দেয় (এক্সপ্রেস রুটে, মঙ্গো ক্যোয়ারির সময়, সেশনের জন্য রেডিস ইত্যাদি)। আশা করি এটি আপনার শুরু হয়েছে।
সিলোনজিরো

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

আমি মনে করি আপনার কাছে উত্তর আছে তবে আমি ত্রুটি পরিচালনার সাথে বিশ্বব্যাপী প্রোমাইজ ব্যবহার করি

// 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/connifications.html#use-mongo-client


এটি একা সতর্কতা সরিয়ে দেয় না। উপরে বর্ণিত হিসাবে আমাদের বিশ্বব্যাপী প্রতিশ্রুতিও মানচিত্রের প্রয়োজন।
বালাসুব্রামণি এম

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.