เอ็นจิ้นการค้นหาและตรวจสอบเซิร์ฟเวอร์เลิกใช้งานแล้ว


96

ฉันใช้ Mongoose กับแอป Node.js ของฉันและนี่คือการกำหนดค่าของฉัน:

mongoose.connect(process.env.MONGO_URI, {
   useNewUrlParser: true,
   useUnifiedTopology: true,
   useCreateIndex: true,
   useFindAndModify: false
}).then(()=>{
    console.log(`connection to database established`)
}).catch(err=>{
    console.log(`db error ${err.message}`);
    process.exit(-1)
})

แต่ในคอนโซลยังเตือนฉัน:

DeprecationWarning: เอ็นจิ้นการค้นหาและการตรวจสอบเซิร์ฟเวอร์ปัจจุบันเลิกใช้งานแล้วและจะถูกลบออกในเวอร์ชันอนาคต ในการใช้เครื่องมือค้นหาและตรวจสอบเซิร์ฟเวอร์ใหม่ให้ส่งตัวเลือก {useUnifiedTopology: true} ไปยังตัวสร้าง MongoClient

อะไรคือปัญหา? ฉันไม่เคยใช้useUnifiedTopologyมาก่อน แต่ตอนนี้มันปรากฏในคอนโซล ฉันเพิ่มมันลงใน config แล้ว แต่มันก็ยังเตือนฉันทำไม? MongoClientฉันไม่ได้ใช้

แก้ไข

ดังที่ Felipe Plets ตอบว่ามีปัญหาในพังพอนและพวกเขาได้แก้ไขข้อบกพร่องนี้ในเวอร์ชันต่อมา ดังนั้นคุณสามารถแก้ปัญหาได้โดยการอัปเดตเวอร์ชันพังพอน

คำตอบ:


170

อัปเดต

Mongoose 5.7.1 วางจำหน่ายแล้วและดูเหมือนว่าจะแก้ไขปัญหาได้ดังนั้นการตั้งค่าuseUnifiedTopologyตัวเลือกจึงทำงานได้ตามที่คาดไว้

mongoose.connect(mongoConnectionString, {useNewUrlParser: true, useUnifiedTopology: true});

คำตอบเดิม

ฉันประสบปัญหาเดียวกันและตัดสินใจที่จะดำน้ำลึกเกี่ยวกับรหัสพังพอน: https://github.com/Automattic/mongoose/search?q=useUnifiedTopology&unscoped_q=useUnifiedTopology

ดูเหมือนจะเป็นตัวเลือกที่เพิ่มเข้ามาใน Mongoose เวอร์ชัน 5.7 และยังไม่ได้รับการบันทึกไว้อย่างดี ฉันไม่พบมันกล่าวถึงในประวัติห้องสมุดhttps://github.com/Automattic/mongoose/blob/master/History.md

ตามความคิดเห็นในรหัส:

  • @param {Boolean} [options.useUnifiedTopology = false] เท็จโดยค่าเริ่มต้น ตั้งค่าให้trueเลือกใช้ชุดการจำลองของไดรเวอร์ MongoDB และเครื่องมือตรวจสอบคลัสเตอร์ที่แตกออก

นอกจากนี้ยังมีปัญหาในโครงการ GitHub เกี่ยวกับข้อผิดพลาดนี้: https://github.com/Automattic/mongoose/issues/8156

ในกรณีของฉันฉันไม่ได้ใช้พังพอนในชุดจำลองหรือคลัสเตอร์ที่ถูกทำลายและแม้ว่าตัวเลือกควรเป็นเท็จ แต่ถ้าเป็นเท็จการตั้งค่าควรเป็นจริง เมื่อเป็นจริงแล้วยังใช้งานไม่ได้อาจเป็นเพราะฐานข้อมูลของฉันไม่ทำงานบนชุดข้อมูลจำลองหรือคลัสเตอร์ที่ถูกจัดเรียง

ฉันได้ลดระดับเป็น 5.6.13 และโครงการของฉันก็กลับมาทำงานได้ดี ดังนั้นตัวเลือกเดียวที่ฉันเห็นในตอนนี้คือการดาวน์เกรดและรอให้การแก้ไขอัปเดตเป็นเวอร์ชันที่ใหม่กว่า


ฉันคิดเหมือนกัน (รุ่นปรับลดรุ่น) ฉันใช้คลัสเตอร์ mlab ดังนั้นอาจเป็นสาเหตุที่คำเตือนไม่หายไป?
iLiA

2
มีข้อผิดพลาดในพังพอนล่าสุด5.7.7ถ้าคุณใช้createConnection()แทนเช่นconnect() จะไม่ถูกนำมาพิจารณาและคุณจะยังคงได้รับคำเตือน เหตุการณ์กับฉันยังคงได้รับคำเตือน mongoose.createConnection(conString, { useUnifiedTopology: true })useUnifiedTopologymongoose.set('useUnifiedTopology', true)
Louis Grellet

2
คำเตือนยังคงมีอยู่หลังจากลดระดับเป็น 5.6.13
O'Dane Brissett

1
ฉันได้รับข้อผิดพลาดนั้นโดยใช้ไดรเวอร์ MongoDB ดั้งเดิม!
Akhila

ที่นี่เรามีตัวเลือกที่เลิกใช้แล้วทั้งหมด: mongoosejs.com/docs/deprecations.html
Murtaza Ahmad

27

ใน mongoDB พวกเขาเลิกใช้งานเซิร์ฟเวอร์ปัจจุบันและแพ็คเกจการตรวจสอบเครื่องยนต์ดังนั้นคุณต้องใช้เซิร์ฟเวอร์และแพ็คเกจการตรวจสอบเครื่องยนต์ใหม่ ดังนั้นคุณเพียงแค่ใช้

{useUnifiedTopology: true}

mongoose.connect("paste db link", {useUnifiedTopology: true, useNewUrlParser: true, useCreateIndex: true });

11
ถ้าคุณอ่านคำถามของฉันฉันกล่าวถึงที่นั่นฉันเพิ่มuseUnifiedTopology: trueในการกำหนดค่าของฉันและมันยังคงแสดงให้เห็นว่าฉันเตือน
Ilia

4
ฉันมีปัญหานี้และฉันก็เพิ่มuseUnifiedTopology: trueแต่ยังคงมีข้อความเดียวกันปรากฏบนคอนโซล
RSA

6
สำหรับใครที่ยังได้รับข้อความให้ลองโทรmongoose.set('useUnifiedTopology', true)ก่อนที่ mongoose.connect
dev4life

ใช่นี่คือคำตอบที่ถูกต้อง คุณต้องใส่ "useUnifiedTopology: true, useNewUrlParser: true" ไว้ในคู่ของ {} ฉันไม่ได้ใช้ "useCreateIndex: true" แต่มันให้ความคิดฉัน วิธีของ dev4life ก็ใช้ได้เช่นกัน
William Hou

mongoose .connect ("db conn url", {useUnifiedTopology: true, useNewUrlParser: true,}) .hen (() => console.log ('MongoDB Connected!')) .catch (err => {err => console .log (err)}) นี่คือสิ่งที่ได้ผลสำหรับฉัน
Sanket Sonavane

9

สิ่งนี้ช่วยแก้ปัญหาของฉันได้

 const url = 'mongodb://localhost:27017';

 const client = new MongoClient(url, {useUnifiedTopology: true});

ขอบคุณสำหรับคำตอบ แต่นี่เป็นคำถามพังพอนและฉันไม่ได้ใช้ mongoclient
iLiA

3
@iLiA ยินดีต้อนรับค่ะ ใช่ฉันรู้. แต่คำตอบนี้อาจช่วยใครบางคนได้เนื่องจากฉันพบคำถามของคุณตรงตามหัวข้อเรื่องไม่ใช่ตามเนื้อหา (และเนื้อหาของคำถามของคุณใกล้เคียงกับข้อมูลทั่วไปเกี่ยวกับ MongoClient มาก)
ЮрийСветлов

3

คุณสามารถลอง async รอ

const connectDB = async () => {
    try {
        await mongoose.connect(<database url>, {
            useNewUrlParser: true,
            useCreateIndex: true,
            useUnifiedTopology: true,
            useFindAndModify: false
        });
        console.log("MongoDB Conected")
    } catch (err) {
        console.error(err.message);
        process.exit(1);
    }
};


ใช้ {useUnifiedTopology: true}
Niran Yousuf

3

ใช้รหัสต่อไปนี้เพื่อหลีกเลี่ยงข้อผิดพลาดนั้น

MongoClient.connect(connectionString, {useNewUrlParser: true, useUnifiedTopology: true});

2
mongoose.connect('mongodb://localhost:27017/Tododb', { useNewUrlParser: true, useUnifiedTopology: true });

จะลบข้อผิดพลาดต่อไปนี้: -

(node: 7481) DeprecationWarning: ตัวแยกวิเคราะห์สตริง URL ปัจจุบันเลิกใช้งานแล้วและจะถูกลบออกในเวอร์ชันอนาคต หากต้องการใช้ตัวแยกวิเคราะห์ใหม่ให้ส่งตัวเลือก {useNewUrlParser: true} ไปยัง MongoClient.connect

(node: 7481) DeprecationWarning: Server Discovery and Monitoring engine ปัจจุบันเลิกใช้งานแล้วและจะถูกลบออกในเวอร์ชันอนาคต ในการใช้เครื่องมือค้นหาและตรวจสอบเซิร์ฟเวอร์ใหม่ให้ส่งตัวเลือก {useUnifiedTopology: true} ไปยังตัวสร้าง MongoClient


3
อย่าลืมเพิ่มuseUnifiedTopology: trueการอ้างอิงทั้งหมดที่ใช้ mongoDB ในกรณีของฉันฉันใช้wiston-mongodbฉันต้องเพิ่มในตัวเลือกด้วย winston.add(new winston.transports.MongoDB({ db: config.get('db'), options: { useUnifiedTopology: true } }));
Gael Musikingala

@GaelMusikingala นี่คือปัญหาของฉัน ขอบคุณที่ชี้ให้เห็น
akmalhakimi1991

@GaelMusikingala ขอบคุณที่ช่วยชีวิตฉัน ❤️👏
Mr.spShuvo

@ Mr.spShuvo โปรดโหวตเพิ่ม
Hassan Ali Shahzad

2

เพิ่มuseUnifiedTopologyตัวเลือกและตั้งค่าให้เป็นจริง

การตั้งค่าอื่น ๆ 3 การกำหนดค่าของmongoose.connectตัวเลือกที่จะจัดการกับอื่น ๆ ที่เหลือDeprecationWarning

การกำหนดค่านี้ใช้ได้กับฉัน!

const url = 'mongodb://localhost:27017/db_name';
mongoose.connect(
    url, 
    { 
        useNewUrlParser: true, 
        useUnifiedTopology: true,
        useCreateIndex: true,
        useFindAndModify: false
    }
)

นี้จะแก้ 4 DeprecationWarning

  1. ตัวแยกวิเคราะห์สตริง URL ปัจจุบันเลิกใช้งานแล้วและจะถูกลบออกในเวอร์ชันอนาคต หากต้องการใช้ตัวแยกวิเคราะห์ใหม่ให้ส่งตัวเลือก {useNewUrlParser: true} ไปยัง MongoClient.connect
  2. เอ็นจิ้นการค้นหาและตรวจสอบเซิร์ฟเวอร์ปัจจุบันเลิกใช้งานแล้วและจะถูกลบออกในเวอร์ชันอนาคต ในการใช้เครื่องมือค้นหาและตรวจสอบเซิร์ฟเวอร์ใหม่ให้ส่งตัวเลือก {useUnifiedTopology: true} ไปยังตัวสร้าง MongoClient
  3. Collection.ensureIndex เลิกใช้แล้ว ใช้ createIndexes แทน
  4. DeprecationWarning: พังพอน: findOneAndUpdate()และfindOneAndDelete()ไม่มีuseFindAndModifyตัวเลือกที่ตั้งค่าเป็นเท็จจะเลิกใช้งาน ดู: https://mongoosejs.com/docs/deprecations.html#-findandmodify-

หวังว่าจะช่วยได้


1
const mongoose = require("mongoose");

mongoose.connect('mongodb://localhost:27017/Edureka',{ useNewUrlParser: true, useUnifiedTopology: true }, (error)=> {
    const connectionStatus = !error ? 'Success': 'Error Connecting to database';
    console.log(connectionStatus);
});

1

หากรหัสของคุณมี createConnetion ด้วยเหตุผลบางประการ (ในกรณีของฉันฉันใช้ GridFsStorage) ให้ลองเพิ่มสิ่งต่อไปนี้ในรหัสของคุณ:

    options: {
        useUnifiedTopology: true,
    }

หลังจากไฟล์เช่นนี้:

    const storage = new GridFsStorage({
    url: mongodbUrl,
    file: (req, file) => {
        return new Promise((resolve, reject) => {
            crypto.randomBytes(16, (err, buf) => {
                if (err) {
                    return reject(err);
                }
                const filename = buf.toString('hex') + path.extname(file.originalname);
                const fileInfo = {
                    filename: filename,
                    bucketName: 'uploads'
                };
                resolve(fileInfo);
            });
        });
    },
    options: {
        useUnifiedTopology: true,
    }
})

หากกรณีของคุณดูเหมือนของฉันสิ่งนี้จะช่วยแก้ปัญหาของคุณได้อย่างแน่นอน ความนับถือ


0

ฉันก็ประสบปัญหาเดียวกัน:

  1. ฉันแน่ใจว่าได้เชื่อมต่อกับ mongoDB แล้วโดยเรียกใช้สิ่งต่อไปนี้บนเทอร์มินัล:

    brew services start mongodb-community@4.2
    

    และฉันได้ผลลัพธ์:

    Successfully started `mongodb-community`
    

คำแนะนำในการติดตั้ง mongodb ที่
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/ หรือhttps://www.youtube.com/watch?v=IGIcrMTtjoU

  1. การกำหนดค่าของฉันมีดังนี้:

    mongoose.connect(config.mongo_uri, {
        useUnifiedTopology: true,
        useNewUrlParser: true})
        .then(() => console.log("Connected to Database"))
        .catch(err => console.error("An error has occured", err));
    

ซึ่งแก้ปัญหาของฉันได้!


0
   const mongo = require('mongodb').MongoClient;

   mongo.connect(process.env.DATABASE,{useUnifiedTopology: true, 
   useNewUrlParser: true}, (err, db) => {
      if(err) {
    console.log('Database error: ' + err);
   } else {
    console.log('Successful database connection');
      auth(app, db)
      routes(app, db)

   app.listen(process.env.PORT || 3000, () => {
      console.log("Listening on port " + process.env.PORT);
    });  

}});


0

การตั้งค่า mongoose connect useUnifiedTopology: true option

  import mongoose from 'mongoose';

        const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
        const database = 'DBName'; // REPLACE WITH YOUR DB NAME
        class Database {
          constructor() {
            this._connect();
          }
          _connect() {
            mongoose.Promise = global.Promise;
            // * Local DB SERVER *
            mongoose
              .connect(`mongodb://${server}/${database}`, {
                useNewUrlParser: true,
                useCreateIndex: true,
                useUnifiedTopology: true
              })
              .then(
                () => console.log(`mongoose version: ${mongoose.version}`),
                console.log('Database connection successful'),
              )
              .catch(err => console.error('Database connection error', err));   
          }
        }
        module.exports = new Database();

0

ฉันต้องการเพิ่มในเธรดนี้ซึ่งอาจเกี่ยวข้องกับการอ้างอิงอื่น ๆ ด้วย

ตัวอย่างเช่นไม่มีสิ่งใดที่ฉันอัปเดตหรือตั้งค่าสำหรับ NodeJS, MongoDB หรือ Mongoose ที่เป็นปัญหา - อย่างไรก็ตาม - connect-mongodb-sessionได้รับการอัปเดตและเริ่มสลิงข้อผิดพลาดเดียวกัน วิธีการแก้ปัญหาในกรณีนี้เป็นเพียงแค่ย้อนกลับรุ่นconnect-mongodb-sessionจากรุ่นไป2.3.02.2.0

ป้อนคำอธิบายภาพที่นี่


0

ฉันมีข้อผิดพลาดเดียวกันปรากฏขึ้นทุกครั้งและสิ่งนี้ได้ผลสำหรับฉัน

mongoose.connect("mongodb://localhost:27017/${yourDB}", {
    useNewUrlParser: true,
    useUnifiedTopology: true

}, function (err) {
    if (err) {
        console.log(err)
    } else {
        console.log("Database connection successful")
    }
});

0

ใช้บรรทัดนี้สิ่งนี้ได้ผลสำหรับฉัน

mongoose.set('useUnifiedTopology', true);

1
หากเป็นไปได้โปรดพยายามให้คำอธิบายเพิ่มเติมแทนการใช้รหัส คำตอบดังกล่าวมีแนวโน้มที่จะเป็นประโยชน์มากขึ้นเนื่องจากช่วยให้สมาชิกในชุมชนและโดยเฉพาะอย่างยิ่งนักพัฒนารายใหม่เข้าใจเหตุผลของโซลูชันได้ดีขึ้นและสามารถช่วยป้องกันไม่ให้ต้องตอบคำถามติดตามผล
Rajan

0

หากคุณใช้เซิร์ฟเวอร์ MongoDB หลังจากใช้การเชื่อมต่อในนาฬิกาคลัสเตอร์ในการเชื่อมต่อและค้นหา URL URL จะเป็นเช่นนี้

<mongodb+srv://Rohan:<password>@cluster0-3kcv6.mongodb.net/<dbname>?retryWrites=true&w=majority>

ในกรณีนี้อย่าลืมเปลี่ยนรหัสผ่านด้วยรหัสผ่านฐานข้อมูลและชื่อฐานข้อมูลของคุณจากนั้นใช้

const client = new MongoClient(url,{useUnifiedTopology:true});

0
mongoose.connect("DBURL", {useUnifiedTopology: true, useNewUrlParser: true, useCreateIndex: true },(err)=>{
    if(!err){
         console.log('MongoDB connection sucess');
        }
    else{ 
        console.log('connection not established :' + JSON.stringify(err,undefined,2));
    }
});

หากเป็นไปได้โปรดพยายามให้คำอธิบายเพิ่มเติมแทนการใช้รหัส คำตอบดังกล่าวมีแนวโน้มที่จะเป็นประโยชน์มากขึ้นเนื่องจากช่วยให้สมาชิกในชุมชนและโดยเฉพาะอย่างยิ่งนักพัฒนารายใหม่เข้าใจเหตุผลของโซลูชันได้ดีขึ้นและสามารถช่วยป้องกันไม่ให้ต้องตอบคำถามติดตามผล
Rajan

0

มันง่ายมากลบรหัสที่คุณเคยใช้และใช้รหัสด้านล่าง:

const url = 'mongodb://localhost:27017';
var dbConn = mongodb.MongoClient.connect(url, {useUnifiedTopology: true});

0

หากคุณใช้ typescript ให้เพิ่มการกำหนดค่าใน MongoOptions

const MongoOptions: MongoClientOptions = {
  useNewUrlParser: true,
  useUnifiedTopology: true,
};

      const client = await MongoClient.connect(url, MongoOptions);

if you not used typescript  
const MongoOptions= {
  useNewUrlParser: true,
  useUnifiedTopology: true,
};

0

สิ่งสำคัญคือต้องรันคำสั่ง mongod และให้เซิร์ฟเวอร์ทำงานต่อไป หากไม่เป็นเช่นนั้นคุณจะยังคงเห็นข้อผิดพลาดนี้

ฉันแนบรหัสของฉันกับคุณ:

const mongodb = require('mongodb')
const MongoClient = mongodb.MongoClient

const connectionURL = 'mongodb://127.0.0.1:27017'
const databaseName = 'task-manager'

MongoClient.connect(connectionURL, {useNewUrlParser: true, useUnifiedTopology: true}, (error, client) => {
    if(error) {
        return console.log('Error connecting to the server.')
    }

    console.log('Succesfully connected.')
})


0

สิ่งนี้จะได้ผล:

// Connect to Mongo
mongoose.set("useNewUrlParser", true);
mongoose.set("useUnifiedTopology", true);

mongoose
  .connect(db) // Connection String here
  .then(() => console.log("MongoDB Connected..."))
  .catch(() => console.log(err));

-1

สิ่งนี้ได้ผลสำหรับฉัน

สำหรับคนที่ใช้MongoClientลองสิ่งนี้:

MongoClient.connect(connectionurl, 
  {useUnifiedTopology: true, useNewUrlParser: true},  callback() {

สำหรับพังพอน:

mongoose.connect(connectionurl, 
         {useUnifiedTopology: true, useNewUrlParser: true}).then(()=>{

ลบการเชื่อมต่ออื่น ๆ


1
ฉันยอมรับว่าฉันไม่ได้ใช้ mongoClient
iLiA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.