หลีกเลี่ยงคำเตือน“ ตัวแยกวิเคราะห์สตริง URL ปัจจุบันเลิกใช้” โดยตั้งค่า useNewUrlParser เป็นจริง


239

ฉันมีคลาส wrapper ฐานข้อมูลที่สร้างการเชื่อมต่อกับอินสแตนซ์ MongoDB บางส่วน:

async connect(connectionString: string): Promise<void> {
        this.client = await MongoClient.connect(connectionString)
        this.db = this.client.db()
}

สิ่งนี้ทำให้ฉันได้รับคำเตือน:

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

connect()วิธีการยอมรับMongoClientOptionsเช่นเป็นอาร์กิวเมนต์ที่สอง useNewUrlParserแต่ก็ไม่ได้มีคุณสมบัติที่เรียกว่า ฉันพยายามตั้งค่าคุณสมบัติเหล่านั้นในสตริงการเชื่อมต่อเช่นนี้: mongodb://127.0.0.1/my-db?useNewUrlParser=trueแต่มันไม่มีผลกับคำเตือนเหล่านั้น

ดังนั้นฉันuseNewUrlParserจะตั้งให้ลบคำเตือนเหล่านั้นได้อย่างไร สิ่งนี้สำคัญสำหรับฉันเนื่องจากสคริปต์ควรทำงานเป็น cron และคำเตือนเหล่านั้นส่งผลให้เกิดจดหมายขยะในถังขยะ

ผมใช้mongodbไดรเวอร์ในรุ่น3.1.0-beta4สอดคล้องกับแพคเกจใน@types/mongodb ทั้งสองคนเป็นฟังเพลงออนไลน์ใหม่ล่าสุดโดยใช้3.0.18npm install

วิธีแก้ปัญหา

การใช้ mongodb รุ่นเก่ากว่า:

"mongodb": "~3.0.8",
"@types/mongodb": "~3.0.18"

5
มันมาจากbetaเวอร์ชั่นที่ปล่อยออกมาตอนบ่ายสองอาทิตย์ ไม่ต้องกังวลเกี่ยวกับมันจนกว่า API จะสรุปได้จริง คุณทำสิ่งที่ถูกต้องในการติดตั้งเวอร์ชันที่เสถียร
Neil Lunn

1
mongodb 3.0.0 ข้างต้นเพิ่มเพียง mongoose.connect ("mongodb: // localhost: portnumber / YourDB", {useNewUrlParser: true})
Majedur Rahaman

คำตอบ:


402

ตรวจสอบmongoเวอร์ชั่นของคุณ:

mongo --version

หากคุณใช้เวอร์ชั่น> = 3.1.0 ให้เปลี่ยนmongoไฟล์การเชื่อมต่อเป็น ->

MongoClient.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true })

หรือไฟล์การเชื่อมต่อพังพอนของคุณไปที่ ->

mongoose.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true });

เป็นการดีที่มันเป็นคุณสมบัติรุ่น 4 แต่ v3.1.0 และสูงกว่านั้นก็รองรับเช่นกัน ตรวจสอบMongoDB GitHub เพื่อดูรายละเอียด


1
@AbhishekSinha ทำไมกับ mongo> = 4.0.0 ฉันใช้ 3.6.5 และข้อความที่น่ารำคาญก็หายไปเช่นกัน
greuze

ใช่แก้ไขแล้ว โดยพื้นฐานแล้วมันเป็นคุณสมบัติ v4 แต่ v3.1.0 ขึ้นไปรองรับคุณสมบัติใหม่เช่นกัน
Abhishek Sinha

3
นี่คือสิ่งที่ดีที่สุดเพียงแค่ต้องการเพิ่มถ้าคุณมีการโทรกลับโดยเฉพาะข้อผิดพลาดเพียงใช้สิ่งนี้: mongoose.connect (dbUrl, {useNewUrlParser: true}, ฟังก์ชั่น (err) {console.log ("mongoDB เชื่อมต่อ", err);})
ptts

ขอบคุณแก้ไขอย่างมืออาชีพ
Hidayt Rahman

46

ตามที่ระบุไว้การ3.1.0-beta4เปิดตัวของไดรเวอร์ได้รับ "ปล่อยเข้าไปในป่า" เร็วไปหน่อยโดยลักษณะของสิ่งต่าง ๆ การเปิดตัวเป็นส่วนหนึ่งของงานที่อยู่ระหว่างดำเนินการเพื่อสนับสนุนคุณสมบัติใหม่ใน MongoDB 4.0 ที่กำลังจะเปิดตัวและทำการเปลี่ยนแปลง API อื่น ๆ

การเปลี่ยนแปลงหนึ่งอย่างที่ก่อให้เกิดการเตือนในปัจจุบันคือuseNewUrlParserตัวเลือกเนื่องจากมีการเปลี่ยนแปลงบางอย่างเกี่ยวกับวิธีการส่งผ่าน URI การเชื่อมต่อที่ใช้งานได้จริง เพิ่มเติมในภายหลัง

จนกว่าสิ่งต่างๆจะ "สงบลง" ก็อาจแนะนำให้ "ปักหมุด"อย่างน้อยให้เป็นรุ่นรองสำหรับการ3.0.xเผยแพร่:

  "dependencies": {
    "mongodb": "~3.0.8"
  }

ที่ควรหยุด3.1.xสาขาที่ถูกติดตั้งในการติดตั้ง "สด" ไปยังโมดูลโหนด หากคุณติดตั้งรีลีส "ล่าสุด" ซึ่งเป็นเวอร์ชัน "เบต้า" อยู่แล้วคุณควรล้างแพ็คเกจ (และpackage-lock.json) และตรวจสอบให้แน่ใจว่าคุณชนเบราว์เซอร์นั้นลงไปใน3.0.xซีรีย์

สำหรับการใช้ตัวเลือกการเชื่อมต่อ "ใหม่" จริง ๆ แล้วข้อ จำกัด หลักคือการรวมportในสตริงการเชื่อมต่อ:

const { MongoClient } = require("mongodb");
const uri = 'mongodb://localhost:27017';  // mongodb://localhost - will fail

(async function() {
  try {

    const client = await MongoClient.connect(uri,{ useNewUrlParser: true });
    // ... anything

    client.close();
  } catch(e) {
    console.error(e)
  }

})()

นั่นเป็นกฎที่ "เข้มงวดมาก" ในรหัสใหม่ จุดหลักคือรหัสปัจจุบันเป็นส่วนหนึ่งของmongodbรหัสพื้นที่เก็บข้อมูล"node-native-driver" (npm ) และ "รหัสใหม่" นำเข้าจริงจากmongodb-coreห้องสมุดซึ่ง "underpins" ไดรเวอร์โหนด "สาธารณะ"

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

ในอนาคตเผยแพร่ parser 'ดั้งเดิม' จะถูกลบแล้ว parser ใหม่ก็จะเป็นสิ่งที่ใช้แม้จะไม่มีตัวเลือก แต่ในเวลานั้นคาดว่ารหัสที่มีอยู่ทั้งหมดจะมีโอกาสมากพอที่จะทดสอบสตริงการเชื่อมต่อที่มีอยู่กับสิ่งที่ parser ใหม่คาดหวัง

ดังนั้นหากคุณต้องการที่จะเริ่มใช้คุณสมบัติของไดรเวอร์ใหม่ที่พวกเขาจะถูกปล่อยออกจากนั้นใช้ที่มีอยู่betaการเผยแพร่และต่อมาและความนึกคิดให้แน่ใจว่าคุณจะให้สตริงการเชื่อมต่อที่ถูกต้องสำหรับตัวแยกวิเคราะห์ใหม่โดยการเปิดใช้ตัวเลือกในuseNewUrlParserMongoClient.connect()

หากคุณไม่จำเป็นต้องเข้าถึงฟีเจอร์ที่เกี่ยวข้องกับการแสดงตัวอย่างของ MongoDB 4.0 release จากนั้นตรึงเวอร์ชันไปที่3.0.xซีรี่ส์ตามที่ระบุไว้ก่อนหน้า สิ่งนี้จะทำงานตามเอกสารและ "การตรึง" เพื่อให้แน่ใจว่าการ3.1.xเผยแพร่จะไม่ "อัปเดต" มากกว่าการพึ่งพาที่คาดไว้จนกว่าคุณจะต้องการติดตั้งเวอร์ชันที่เสถียรจริง ๆ


1
คุณมีข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่คุณหมายถึงเมื่อคุณพูดว่า "ปล่อยสู่ป่า" หรือไม่? 3.1.0-beta4 หลบหนีจากสวนสัตว์ได้อย่างไร คุณสามารถอ้างอิงผู้อ้างอิงเกี่ยวกับสิ่งนั้นได้หรือไม่?
Wyck

2
@Wyck "การอ้างอิง" แน่นอนว่าในเวลาที่คำถามถูกถามnpm install mongodbทำให้การ"เบต้า" (ทำเครื่องหมายอย่างชัดเจนในสตริงเวอร์ชั่นที่แสดงในคำถาม) กำลังถูกติดตั้งเนื่องจากถูกทำเครื่องหมายเป็นstableที่เก็บ npm เมื่อมัน ไม่ควรได้รับ นี่เป็นข้อผิดพลาดที่เกิดขึ้นจริงในเวลาและควรได้รับการพิจารณาเสมอหากมีการแสดงรหัสalphaหรือbetaรุ่นของสตริงที่มีการทำเครื่องหมายว่ามีเสถียรภาพ เวลาผ่านไปอย่างเป็นธรรมชาติและนี่เป็นคุณลักษณะในการเผยแพร่ที่เสถียรในขณะนี้จนกระทั่ง (ดังที่ระบุไว้) ในที่สุดมันก็จะหายไป
Neil Lunn

45

รหัสที่ไฮไลต์ด้านล่างเพื่อการเชื่อมต่อพังพอนแก้ไขคำเตือนสำหรับไดรเวอร์พังพอน:

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

4
ไม่ทำงานสำหรับฉัน ยังคงได้รับ: (โหนด: 35556) DeprecationWarning: ตัวแยกวิเคราะห์สตริง URL ปัจจุบันเลิกใช้แล้วและจะถูกลบในเวอร์ชันอนาคต หากต้องการใช้ parser ใหม่ให้ส่งตัวเลือก {useNewUrlParser: true} ไปยัง MongoClient.connect
อเล็กซ์

คุณต้องบันทึก server.js หรือ app.js ทุกที่ที่คุณให้เส้นทาง DB หากยังไม่ทำงานลองลบและติดตั้ง node_modules อีกครั้งโดยป้อนการติดตั้ง npm เมื่อใดก็ตามที่ไฟล์ package.json ของคุณอยู่
Narendra Maru

24

ไม่มีอะไรเปลี่ยนแปลง ผ่านในฟังก์ชั่นเชื่อมต่อ{useNewUrlParser: true }เท่านั้น

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

MongoClient.connect(url, {useNewUrlParser: true}, function(err, db) {
    if(err) {
        console.log(err);
    }
    else {
        console.log('connected to ' + url);
        db.close();
    }
})

แค่สิ่งที่ฉันต้องการ แต่ข้อความเตือนยังคงอยู่: -S
alex351

ใช้งานได้สำหรับฉันไม่มีคำเตือนอีกต่อไป
Q. เฉียว

17

คุณต้องเพิ่ม{ useNewUrlParser: true }วิธีการ mongoose.connect ()

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

1
คำตอบนี้เหมือนกับคำตอบอื่น ๆ ที่โพสต์เมื่อเดือนก่อน
Daniel W.

สิ่งนี้แตกต่างจากคำตอบก่อนหน้าอย่างไร
Peter Mortensen

@PeterMortensen โปรดตรวจสอบวันที่โพสต์คำตอบก่อน
KARTHIKEYAN.A

15

รูปแบบสตริงการเชื่อมต่อต้องเป็นmongodb: // ผู้ใช้: รหัสผ่าน @ host: พอร์ต / db

ตัวอย่างเช่น:

MongoClient.connect('mongodb://user:password@127.0.0.1:27017/yourDB', { useNewUrlParser: true } )

ไม่MongoClient.connect('mongodb://127.0.0.1:27017/yourDB', { useNewUrlParser: true } )ทำงานเกินไป
Nino Filiu

สิ่งนี้แตกต่างจากคำตอบก่อนหน้าอย่างไร
Peter Mortensen

15

คุณต้องตั้งค่าสิ่งต่าง ๆ ต่อไปนี้ก่อนที่จะเชื่อมต่อกับฐานข้อมูลดังต่อไปนี้:

const mongoose = require('mongoose');

mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useUnifiedTopology', true);

mongoose.connect('mongodb://localhost/testaroo');

นอกจากนี้

Replace update() with updateOne(), updateMany(), or replaceOne()
Replace remove() with deleteOne() or deleteMany().
Replace count() with countDocuments(), unless you want to count how many documents are in the whole collection (no filter).
In the latter case, use estimatedDocumentCount().

3
ควรเป็นคำตอบที่ดีที่สุด คำตอบอื่น ๆ ทั้งหมดสำหรับฉันล้มเหลวอย่างน่าสังเวช
Anthony

กรุณาทำเครื่องหมาย ans ราวกับcorrectว่ามันได้ผลสำหรับคุณ มันก็ใช้ได้ผลสำหรับฉันเช่นกัน!
Arpan Banerjee

9

งานต่อไปนี้สำหรับฉัน

const mongoose = require('mongoose');

mongoose.connect("mongodb://localhost/playground", { useNewUrlParser: true,useUnifiedTopology: true })
.then(res => console.log('Connected to db'));

รุ่นmongoose5.8.10


1
อันนี้ใช้ได้สำหรับฉันด้วย ฉันกำลังใช้body-parser": "^1.19.0", "express": "^4.17.1", "mongoose": "^5.9.14"
Arpan Banerjee

8

ฉันไม่คิดว่าคุณจะต้องเพิ่ม { useNewUrlParser: true }ผมไม่คิดว่าคุณจะต้องเพิ่ม

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

ตามที่ระบุในConnection String URI Formatคุณไม่จำเป็นต้องตั้งหมายเลขพอร์ต

แค่เพิ่ม{ useNewUrlParser: true }ก็พอ


1
ฉันได้เพิ่มหมายเลขพอร์ตแล้วและยังได้รับข้อความแสดงข้อผิดพลาด ฉันพบข้อความแสดงข้อผิดพลาดที่ทำให้สับสนและทำให้เข้าใจผิด: ทำไมฉันได้รับข้อความแจ้งให้ฉันใช้รูปแบบใหม่เมื่อจริง ๆ แล้วฉันใช้รูปแบบเก่าและทำงานได้อย่างสมบูรณ์แบบ ... !!
Nico

2
คำถามที่ดี! โปรดทราบว่ามันเป็นคำเตือน ไม่ใช่ข้อผิดพลาด useNewUrlParser: trueคำเตือนจะหายไปโดยการเพิ่มเข้ามาเท่านั้น แต่นั่นค่อนข้างโง่เนื่องจากพารามิเตอร์พิเศษนี้จะล้าสมัยเมื่อ Mongo เปลี่ยนไปใช้ตัวแยกวิเคราะห์ URL ใหม่
Sam

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

@Brad แน่นอน ฉันสมมติว่าคุณต้องการเพิ่มหมายเลขพอร์ต แต่สเป็ค Mongo ยังระบุหมายเลขพอร์ตว่าเป็นตัวเลือก ฉันปรับปรุงคำตอบของฉันตาม
Sam

8

อัปเดตสำหรับECMAScript 8 / รอ

แสดงรหัสสาธิต ECMAScript 8 ที่ไม่ถูกต้องMongoDB incยังสร้างคำเตือนนี้

MongoDB ให้คำแนะนำต่อไปนี้ซึ่งไม่ถูกต้อง

หากต้องการใช้ parser ใหม่ให้ส่งตัวเลือก {useNewUrlParser: true} ไปยัง MongoClient.connect

การทำเช่นนี้จะทำให้เกิดข้อผิดพลาดต่อไปนี้:

TypeError: อาร์กิวเมนต์สุดท้ายที่จะexecuteOperationต้องเป็นโทรกลับ

ต้องให้ตัวเลือกnew MongoClientแทน:

ดูรหัสด้านล่าง:

const DATABASE_NAME = 'mydatabase',
    URL = `mongodb://localhost:27017/${DATABASE_NAME}`

module.exports = async function() {
    const client = new MongoClient(URL, {useNewUrlParser: true})
    var db = null
    try {
        // Note this breaks.
        // await client.connect({useNewUrlParser: true})
        await client.connect()
        db = client.db(DATABASE_NAME)
    } catch (err) {
        console.log(err.stack)
    }

    return db
}

7

ปัญหาสามารถแก้ไขได้โดยให้หมายเลขพอร์ตและใช้ parser นี้: {useNewUrlParser: true}

การแก้ปัญหาสามารถ:

mongoose.connect("mongodb://localhost:27017/cat_app", { useNewUrlParser: true });

มันแก้ปัญหาของฉัน


3
คอนโซลเองให้โซลูชันเพื่อเพิ่มuseNewUrlParser propertyในconnectแต่โซลูชันของคุณช่วย โหวตแล้ว!
ganeshdeshmukh

7

ตัวอย่างที่สมบูรณ์สำหรับ Express.js, กรณีการเรียก API และการส่งเนื้อหา JSON มีดังต่อไปนี้:

...
app.get('/api/myApi', (req, res) => {
  MongoClient.connect('mongodb://user:password@domain.com:port/dbname',
    { useNewUrlParser: true }, (err, db) => {

      if (err) throw err
      const dbo = db.db('dbname')
      dbo.collection('myCollection')
        .find({}, { _id: 0 })
        .sort({ _id: -1 })
        .toArray(
          (errFind, result) => {
            if (errFind) throw errFind
            const resultJson = JSON.stringify(result)
            console.log('find:', resultJson)
            res.send(resultJson)
            db.close()
          },
        )
    })
}

4

นี่คือวิธีที่ฉันมี คำใบ้ไม่ปรากฏบนคอนโซลของฉันจนกว่าฉันจะอัปเดต npm ก่อนหน้านี้สองสามวัน

.connect มีพารามิเตอร์สามตัวคือ URI ตัวเลือกและข้อผิดพลาด

mongoose.connect(
    keys.getDbConnectionString(),
    { useNewUrlParser: true },
    err => {
        if (err) 
            throw err;
        console.log(`Successfully connected to database.`);
    }
);

4

เรากำลังใช้:

mongoose.connect("mongodb://localhost/mean-course").then(
  (res) => {
   console.log("Connected to Database Successfully.")
  }
).catch(() => {
  console.log("Connection to database failed.");
});

→สิ่งนี้ให้ข้อผิดพลาดในการแยกวิเคราะห์ URL

ไวยากรณ์ที่ถูกต้องคือ:

mongoose.connect("mongodb://localhost:27017/mean-course" , { useNewUrlParser: true }).then(
  (res) => {
   console.log("Connected to Database Successfully.")
  }
).catch(() => {
  console.log("Connection to database failed.");
});

1
เพิ่มคำอธิบายบางอย่าง
แมทธิวส์ซันนี่

4

คุณเพียงแค่ต้องเพิ่ม

{ useNewUrlParser: true }

ภายในวิธีการ mongoose.connect


1
สิ่งนี้แตกต่างจากคำตอบก่อนหน้าอย่างไร
Peter Mortensen

ตรวจสอบแฮช
AGrush

2

งานต่อไปนี้สำหรับฉันสำหรับรุ่น 5.9.16

const mongoose = require('mongoose');

mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useUnifiedTopology', true);

mongoose.connect('mongodb://localhost:27017/dbName')
    .then(() => console.log('Connect to MongoDB..'))
    .catch(err => console.error('Could not connect to MongoDB..', err))

1

บรรทัดเหล่านี้ใช้กลอุบายสำหรับคำเตือนเรื่องเลิกใช้งานอื่น ๆ ทั้งหมดด้วย:

const db = await mongoose.createConnection(url, { useNewUrlParser: true });
mongoose.set('useCreateIndex', true);
mongoose.set('useFindAndModify', false);

1

ฉันใช้ mlab.com เป็นฐานข้อมูล MongoDB ฉันแยกสตริงการเชื่อมต่อไปยังโฟลเดอร์อื่นที่ชื่อconfigและข้างในไฟล์keys.jsฉันเก็บสตริงการเชื่อมต่อซึ่งก็คือ:

module.exports = {
  mongoURI: "mongodb://username:password@ds147267.mlab.com:47267/projectname"
};

และรหัสเซิร์ฟเวอร์ก็คือ

const express = require("express");
const mongoose = require("mongoose");
const app = express();

// Database configuration
const db = require("./config/keys").mongoURI;

// Connect to MongoDB

mongoose
  .connect(
    db,
    { useNewUrlParser: true } // Need this for API support
  )
  .then(() => console.log("MongoDB connected"))
  .catch(err => console.log(err));

app.get("/", (req, res) => res.send("hello!!"));

const port = process.env.PORT || 5000;

app.listen(port, () => console.log(`Server running on port ${port}`)); // Tilde, not inverted comma

คุณต้องเขียน {useNewUrlParser: true} หลังจากสตริงการเชื่อมต่อตามที่ฉันทำด้านบน

พูดง่าย ๆ คุณต้องทำ:

mongoose.connect(connectionString,{ useNewUrlParser: true } 
// Or
MongoClient.connect(connectionString,{ useNewUrlParser: true } 
    


1

ฉันใช้พังพอนรุ่น 5.x สำหรับโครงการของฉัน หลังจากต้องการแพ็คเกจพังพอนให้ตั้งค่าทั่วโลกดังนี้

const mongoose = require('mongoose');

// Set the global useNewUrlParser option to turn on useNewUrlParser for every connection by default.
mongoose.set('useNewUrlParser', true);

0

หากusernameหรือpasswordมี@ตัวละครให้ใช้เช่นนี้:

mongoose
    .connect(
        'DB_url',
        { user: '@dmin', pass: 'p@ssword', useNewUrlParser: true }
    )
    .then(() => console.log('Connected to MongoDB'))
    .catch(err => console.log('Could not connect to MongoDB', err));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.