Hindari "parser string URL saat ini sudah usang" peringatan dengan mengatur useNewUrlParser menjadi true

239

Saya memiliki kelas pembungkus basis data yang membuat koneksi ke beberapa instance MongoDB:

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

Ini memberi saya peringatan:

(node: 4833) DeprecationWarning: parser string URL saat ini sudah tidak digunakan lagi, dan akan dihapus dalam versi yang akan datang. Untuk menggunakan parser baru, kirimkan opsi {useNewUrlParser: true} ke MongoClient.connect.

The connect()Metode menerima MongoClientOptionsmisalnya sebagai argumen kedua. Tetapi tidak memiliki properti yang disebut useNewUrlParser. Saya juga mencoba mengatur properti-properti itu dalam string koneksi seperti ini: mongodb://127.0.0.1/my-db?useNewUrlParser=truetetapi tidak berpengaruh pada peringatan tersebut.

Jadi bagaimana saya bisa mengatur useNewUrlParseruntuk menghapus peringatan itu? Ini penting bagi saya karena skrip harus dijalankan sebagai cron dan peringatan itu menghasilkan spam trash-mail.

Saya menggunakan mongodbdriver dalam versi 3.1.0-beta4dengan @types/mongodbpaket yang sesuai di 3.0.18. Keduanya merupakan penggunaan terbaru yang tersedia npm install.

Penanganan masalah

Menggunakan versi driver mongodb yang lebih lama:

"mongodb": "~3.0.8",
"@types/mongodb": "~3.0.18"
Singa
sumber
5
Itu berasal dari betaversi yang entah bagaimana dirilis pada npm selama akhir pekan. Jangan khawatir tentang hal itu sampai API benar-benar selesai. Anda melakukan hal yang benar menginstal versi stabil.
Neil Lunn
1
di atas 3.0.0 dari mongodb, tambahkan saja mongoose.connect ("mongodb: // localhost: portnumber / YourDB", {useNewUrlParser: true})
Majedur Rahaman

Jawaban:

402

Periksa mongoversi Anda :

mongo --version

Jika Anda menggunakan versi> = 3.1.0, ubah mongofile koneksi Anda ke ->

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

atau file koneksi luwak Anda ke ->

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

Idealnya, ini adalah fitur versi 4, tetapi v3.1.0 dan di atasnya juga mendukungnya. Lihat MongoDB GitHub untuk detailnya.

Abhishek Sinha
sumber
1
@AbhishekSinha Mengapa dengan mongo> = 4.0.0? Saya menggunakan 3.6.5 dan pesan yang mengganggu telah hilang juga.
greuze
Yup memperbaikinya. Pada dasarnya, ini adalah fitur v4 tetapi v3.1.0 dan di atasnya mendukung fitur baru juga.
Abhishek Sinha
3
Ini adalah yang terbaik, hanya ingin menambahkan, jika Anda memiliki panggilan balik, esp untuk kesalahan, cukup gunakan ini: mongoose.connect (dbUrl, {useNewUrlParser: true}, function (err) {console.log ("mongoDB terhubung", err);})
Poin
Terima kasih, Tetap seperti pro
Hidayt Rahman
46

Seperti dicatat, 3.1.0-beta4pembebasan pengemudi "dilepaskan ke alam liar" sedikit lebih awal dengan penampilan. Rilis ini merupakan bagian dari pekerjaan yang sedang berlangsung untuk mendukung fitur-fitur yang lebih baru dalam rilis MongoDB 4.0 mendatang dan membuat beberapa perubahan API lainnya.

Salah satu perubahan yang memicu peringatan saat ini adalah useNewUrlParseropsi, karena beberapa perubahan sekitar bagaimana lewat koneksi URI sebenarnya bekerja. Lebih lanjut tentang itu nanti.

Sampai hal-hal "menetap", mungkin disarankan untuk "menyematkan" setidaknya ke versi minor untuk 3.0.xrilis:

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

Itu harus menghentikan 3.1.xcabang yang diinstal pada instalasi "segar" ke modul simpul. Jika Anda sudah menginstal rilis "terbaru" yang merupakan versi "beta", maka Anda harus membersihkan paket-paket Anda (dan package-lock.json) dan pastikan Anda menabraknya ke 3.0.xrilis seri.

Sedangkan untuk benar-benar menggunakan opsi URI koneksi "baru", batasan utama adalah untuk benar-benar menyertakan portpada string koneksi:

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

})()

Itu aturan yang lebih "ketat" dalam kode baru. Poin utama adalah bahwa kode saat ini pada dasarnya adalah bagian dari mongodbkode repositori "node-native-driver" (npm ), dan "kode baru" sebenarnya diimpor dari mongodb-coreperpustakaan yang "menopang" driver node "publik".

Inti dari "opsi" yang ditambahkan adalah untuk "memudahkan" transisi dengan menambahkan opsi ke kode baru sehingga parser yang lebih baru (sebenarnya berbasis di sekitar url) digunakan dalam kode menambahkan opsi dan menghapus peringatan penghentian, dan karenanya memverifikasi bahwa string koneksi Anda yang lewat benar-benar sesuai dengan apa yang diharapkan oleh parser baru.

Di rilis mendatang parser 'legacy' akan dihapus dan kemudian parser baru akan menjadi apa yang digunakan bahkan tanpa opsi. Tetapi pada saat itu, diharapkan bahwa semua kode yang ada memiliki kesempatan yang cukup untuk menguji string koneksi yang ada terhadap apa yang diharapkan oleh pengurai baru.

Jadi jika Anda ingin mulai menggunakan fitur driver baru saat dirilis, maka gunakan betarilis yang tersedia dan berikutnya dan idealnya pastikan Anda menyediakan string koneksi yang valid untuk parser baru dengan mengaktifkan useNewUrlParseropsi di MongoClient.connect().

Jika Anda tidak benar-benar membutuhkan akses ke fitur yang berkaitan dengan pratinjau rilis MongoDB 4.0, maka sematkan versi ke a 3.0.x seri seperti disebutkan sebelumnya. Ini akan berfungsi seperti yang didokumentasikan dan "menyematkan" ini memastikan bahwa 3.1.xrilis tidak "diperbarui" selama ketergantungan yang diharapkan sampai Anda benar-benar ingin menginstal versi stabil.

Neil Lunn
sumber
1
Apakah Anda memiliki informasi lebih lanjut tentang apa yang Anda maksud ketika Anda mengatakan "dilepaskan ke alam liar"? Bagaimana 3.1.0-beta4 lolos dari kebun binatang? Bisakah Anda mengutip referensi tentang itu?
Wyck
2
@Wyck "Referensi" tentu saja bahwa pada saat pertanyaan itu diajukan, apakah npm install mongodbmenghasilkan "beta" (ditandai dengan jelas dalam string versi yang ditunjukkan dalam pertanyaan) diinstal karena ditandai sebagai stabledalam repositori npm ketika itu seharusnya tidak. Ini memang kesalahan pada saat itu dan harus selalu dipertimbangkan sehingga jika ada rilis kode yang menunjukkan alphaatau betadi dalam string versi ditandai dengan sama sebagai stabil. Secara alami waktu telah berlalu dan ini adalah fitur dalam rilis stabil sekarang, sampai (seperti disebutkan) akhirnya akan hilang.
Neil Lunn
45

Kode yang disorot di bawah ini untuk koneksi luwak memecahkan peringatan untuk pengemudi luwak:

mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
Narendra Maru
sumber
4
tidak bekerja untukku. masih mendapatkan: (node: 35556) DeprecationWarning: parser string URL saat ini sudah tidak digunakan lagi, dan akan dihapus di versi yang akan datang. Untuk menggunakan parser baru, kirimkan opsi {useNewUrlParser: true} ke MongoClient.connect.
Alex
Anda harus menyimpan server.js atau app.js di mana pun Anda memberikan jalur DB jika masih tidak berhasil coba dengan menghapus dan menginstal ulang node_modules dengan memasukkan npm install setiap kali file package.json Anda
Narendra Maru
24

Tidak ada yang berubah. Lulus hanya dalam fungsi koneksi {useNewUrlParser: true }.

Ini akan berhasil:

MongoClient.connect(url, {useNewUrlParser: true}, function(err, db) {
    if(err) {
        console.log(err);
    }
    else {
        console.log('connected to ' + url);
        db.close();
    }
})
AAshish jha
sumber
Hanya yang saya butuhkan, tetapi pesan peringatan masih ada: -S
alex351
Bekerja untuk saya, tidak ada peringatan lagi.
Q. Qiao
17

Anda perlu menambahkan { useNewUrlParser: true }metode mongoose.connect ().

mongoose.connect('mongodb://localhost:27017/Notification',{ useNewUrlParser: true });
KARTHIKEYAN.A
sumber
1
jawaban ini sama dengan jawaban lain yang telah diposting bulan sebelumnya
Daniel W.
Apa bedanya dengan jawaban sebelumnya?
Peter Mortensen
@PeterMortensen silakan periksa tanggal siapa yang memposting jawaban pertama
KARTHIKEYAN.
15

Format string koneksi harus mongodb: // pengguna: kata sandi @ host: port / db

Sebagai contoh:

MongoClient.connect('mongodb://user:[email protected]:27017/yourDB', { useNewUrlParser: true } )
Boris Traljić
sumber
Tidak. MongoClient.connect('mongodb://127.0.0.1:27017/yourDB', { useNewUrlParser: true } )Bekerja juga.
Nino Filiu
Apa bedanya dengan jawaban sebelumnya?
Peter Mortensen
15

Anda hanya perlu mengatur hal-hal berikut sebelum menghubungkan ke database seperti di bawah ini:

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

Juga,

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().
SJ
sumber
3
Harus menjadi jawaban teratas. Semua jawaban lain untuk saya gagal total.
Anthony
Tolong tandai ans seolah- correctolah itu bekerja untuk Anda. Itu juga bekerja untuk saya!
Arpan Banerjee
9

Berikut ini berfungsi untuk saya

const mongoose = require('mongoose');

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

The mongooseversi 5.8.10.

techguru
sumber
1
Yang ini juga bekerja untuk saya. Saya menggunakan--body-parser": "^1.19.0", "express": "^4.17.1", "mongoose": "^5.9.14"
Arpan Banerjee
8

Saya pikir Anda tidak perlu menambahkan { useNewUrlParser: true }.

Terserah Anda jika Anda sudah ingin menggunakan parser URL baru. Akhirnya peringatan akan hilang ketika MongoDB beralih ke parser URL baru mereka.

Seperti yang ditentukan dalam Format URI String Koneksi , Anda tidak perlu mengatur nomor port.

Menambahkan saja { useNewUrlParser: true }sudah cukup.

Sam
sumber
1
Saya telah menambahkan nomor port dan masih mendapatkan pesan kesalahan. Saya menemukan pesan kesalahan sangat membingungkan dan menyesatkan: mengapa saya mendapatkan pesan yang memberitahu saya untuk menggunakan format baru, padahal sebenarnya saya menggunakan format lama dan berfungsi dengan baik ... !! ??
Nico
2
Pertanyaan bagus! Perhatikan bahwa ini peringatan. Bukan kesalahan. Hanya dengan menambahkan useNewUrlParser: true, peringatan akan hilang. Tapi itu agak bodoh karena parameter tambahan ini akan menjadi usang setelah mongo beralih ke url parser baru mereka.
Sam
bagaimana Anda tahu bahwa nomor port adalah yang diharapkan oleh url parser baru? Saya tidak dapat menemukan apa pun yang benar-benar menggambarkan apa pengurai url baru
Brad
@Brad, memang. Saya berasumsi Anda perlu menambahkan nomor port, tetapi spesifikasi Mongo masih menyebut nomor port sebagai opsional. Saya memperbarui jawaban saya sesuai.
Sam
8

Diperbarui untuk ECMAScript 8 / tunggu

Yang salah ECMAScript 8 demo kode MongoDB inc menyediakan juga menciptakan peringatan ini.

MongoDB memberikan saran berikut, yang tidak benar

Untuk menggunakan parser baru, kirimkan opsi {useNewUrlParser: true} ke MongoClient.connect.

Melakukan ini akan menyebabkan kesalahan berikut:

TypeError: argumen terakhir executeOperationharus berupa panggilan balik

Sebagai gantinya , opsi harus disediakan untuknew MongoClient :

Lihat kode di bawah ini:

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
}
mikemaccana
sumber
7

Masalahnya dapat diatasi dengan memberikan nomor port dan menggunakan parser ini: {useNewUrlParser: true}

Solusinya dapat:

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

Ini memecahkan masalah saya.

Mehedi Abdullah
sumber
3
konsol itu sendiri memberikan solusi untuk menambahkan useNewUrlParser propertydi connect, tapi solusi Anda membantu. jadi Terpilih!
ganeshdeshmukh
7

Contoh lengkap untuk Express.js, wadah panggilan API, dan pengiriman konten JSON adalah sebagai berikut:

...
app.get('/api/myApi', (req, res) => {
  MongoClient.connect('mongodb://user:[email protected]: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()
          },
        )
    })
}
Roma
sumber
4

Begini cara saya memilikinya. Petunjuk tidak muncul di konsol saya sampai saya memperbarui npm beberapa hari sebelumnya.

.connect memiliki tiga parameter, URI, opsi, dan err.

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

Kami menggunakan:

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

→ Ini memberikan kesalahan parser URL

Sintaks yang benar adalah:

mongoose.connect("mongodb://localhost:27017/mean-course" , { useNewUrlParser: true }).then(
  (res) => {
   console.log("Connected to Database Successfully.")
  }
).catch(() => {
  console.log("Connection to database failed.");
});
BASUM KUMAR
sumber
1
Tambahkan deskripsi
Mathews Sunny
4

Anda hanya perlu menambahkan

{ useNewUrlParser: true }

di dalam metode mongoose.connect.

AGrush
sumber
1
Apa bedanya dengan jawaban sebelumnya?
Peter Mortensen
periksa hash.
AGrush
2

Pekerjaan berikut untuk saya untuk versi 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))
Lalit Tyagi
sumber
1

Baris-baris ini melakukan trik untuk semua peringatan penghinaan lainnya juga:

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

Saya menggunakan mlab.com sebagai basis data MongoDB. Saya memisahkan string koneksi ke folder berbeda bernama configdan di dalam file keys.js saya menyimpan string koneksi yang:

module.exports = {
  mongoURI: "mongodb://username:[email protected]:47267/projectname"
};

Dan kode servernya

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

Anda perlu menulis {useNewUrlParser: true} setelah string koneksi seperti yang saya lakukan di atas.

Sederhananya, Anda perlu melakukan:

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

zibon
sumber
1

Saya menggunakan versi luwak 5.x untuk proyek saya. Setelah membutuhkan paket luwak, atur nilainya secara global seperti di bawah ini.

const mongoose = require('mongoose');

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

Jika usernameatau passwordmemiliki @karakter, gunakan seperti ini:

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));
Saahithyan Vigneswaran
sumber