(โหนด: 3341) การเลิกใช้คำเตือน: พังพอน: 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);

ไดรเวอร์เป็นตัวอย่างของคลาสไดรเวอร์

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

ตัวอย่างในเอกสารกำลังใช้ไลบรารีคำสัญญาของ bluebird แต่ฉันเลือกใช้สัญญา ES6 ดั้งเดิม

ในไฟล์ที่ฉันโทร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 อ้างถึงฉันเชื่อว่าโซลูชันของเขาคุ้มค่าที่จะโหวตแทนข้อเสนอแรก ฉันยังคงขอบคุณ Hunter Lester สำหรับผลงานที่ยอดเยี่ยมและการสืบสวนและการแบ่งปันสิ่งที่เขาค้นพบ!
Isak La Fleur

ขอบคุณสำหรับการแก้ไขของคุณที่ทำให้ฉันรู้ถึงข้อบกพร่องในการแสดงอย่างมาก
Yusuf Kamil AK

72

แม้ว่าคำตอบข้างต้นจะถูกต้องและใช้งานได้ แต่คุณต้องคำนึงถึงปัญหาของประสิทธิภาพหากคุณมีแอปโหนดการผลิตจริง

วิธีแก้ปัญหาข้างต้นจะใช้สัญญา ES6 ดั้งเดิมซึ่งช้ากว่าบลูเบิร์ดถึง4 เท่าในเกณฑ์มาตรฐานที่ฉันแบ่งปันด้านล่าง สิ่งนี้อาจส่งผลกระทบอย่างมากต่อประสิทธิภาพของ API ที่เขียนใน Node และการใช้ MongoDB

ฉันแนะนำให้ใช้ 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-generic x64
  • โหนด JS 6.9.4
  • V8 5.1.281.89
  • Intel (R) Core (TM) i7-6500U CPU ที่ 2.50GHz × 4
  • RAM 16 GB พร้อม SSD 500 GB

    | 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 รายการและเป้าหมายที่ปรับขนาดได้ยาก) และมักจะต้องตัดสินใจใช้การโทรกลับแบบซ้อนกันแบบง่ายๆตามคำสัญญา โดยส่วนตัวแล้วฉันคิดว่าเกณฑ์มาตรฐานเป็นเพียงขั้นตอนแรกในการตัดสินใจ แต่ฉันยังไม่สามารถแบ่งปันข้อมูลภายในของฉันได้ ... เป้าหมายขนาดของฉันคือผู้ใช้ 10K ต่อเครื่องจริง
SylonZero

นอกจากนี้การเพิ่มคะแนนโหวตแทบจะไม่สามารถวัดคำตอบได้อย่างเต็มที่ จากประสบการณ์ของฉันหลายคนแทบจะไม่ได้ขุดลึกลงไปหลังจากที่ปัญหาได้รับการแก้ไขแล้ว (หรืออ่านสิ่งอื่นใด) และโปรแกรมเมอร์หลายคนที่ฉันเคยให้คำปรึกษาในอดีตจำเป็นต้องได้รับการสอนเกี่ยวกับประสิทธิภาพและทักษะการใช้เครื่องมือสำหรับโค้ด
SylonZero

1
ขอบคุณมากที่แจ้งปัญหาด้านประสิทธิภาพ ฉันเป็นโปรแกรมเมอร์มือใหม่เพียง 2 ปีเท่านั้นและกระหายการศึกษานี้ ฉันใช้สิ่งนี้ในการผลิตดังนั้นฉันก็ยิ่งดีใจที่รู้ว่ามัน อะไรคือวิธีที่ดีที่สุดในการใช้โปรแกรมเปรียบเทียบและโค้ดต่างๆ
Hunter Lester

1
Hunter ซึ่งจะขึ้นอยู่กับลักษณะของแพลตฟอร์มและรหัส แต่เกี่ยวข้องกับคำถามนี้: มีสองด้านในการทำความเข้าใจ - 1. การทดสอบที่ดีที่จะใช้ผ่านตัวสร้างโหลดเพื่อจำลองคำขอของผู้ใช้ ฉันใช้ Apache jMeter เพื่อทดสอบ Node API ของฉันและสร้างโหลดสำหรับผู้ใช้หลายคน 2. เครื่องมือวัด: คุณติดตามธุรกรรมแต่ละรายการได้อย่างไร ฉันใช้ NewRelic เพื่อสร้างโค้ด Node ของฉัน - มันให้รายละเอียดโดยละเอียดของทุกธุรกรรมเป็นมิลลิวินาที (ลงไปที่เส้นทาง 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;
      }
});

ต้องมีการเชื่อมต่อกับความช่วยเหลือของสัญญาในพังพอนเวอร์ชันล่าสุด [นี่คือลิงค์] [1] [1]: http://mongoosejs.com/docs/promises.html


0

เพียงแค่เพิ่มพารามิเตอร์ที่สองเป็นวัตถุในเมธอด connect ()

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

ดู: http://mongoosejs.com/docs/connections.html#use-mongo-client


เพียงอย่างเดียวนี้ไม่ได้ลบคำเตือน เราจำเป็นต้องทำแผนที่คำมั่นสัญญาทั่วโลกตามที่กล่าวไว้
Balasubramani 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 }})

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.