Tránh bộ phân tích cú pháp chuỗi URL hiện tại không được chấp nhận bằng cách đặt useNewUrlParser thành true


238

Tôi có một lớp trình bao bọc cơ sở dữ liệu thiết lập kết nối đến một số thể hiện MongoDB:

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

Điều này đã cho tôi một cảnh báo:

(nút: 4833) DeprecationWarning: trình phân tích cú pháp chuỗi URL hiện tại không được dùng nữa và sẽ bị xóa trong phiên bản tương lai. Để sử dụng trình phân tích cú pháp mới, hãy chuyển tùy chọn {useNewUrlParser: true} sang MongoClient.connect.

Các connect()phương pháp chấp nhận một MongoClientOptionsví dụ như là đối số thứ hai. Nhưng nó không có một tài sản được gọi là useNewUrlParser. Tôi cũng đã cố gắng đặt các thuộc tính đó trong chuỗi kết nối như thế này: mongodb://127.0.0.1/my-db?useNewUrlParser=truenhưng nó không có tác dụng đối với các cảnh báo đó.

Vì vậy, làm thế nào tôi có thể thiết lập useNewUrlParserđể loại bỏ những cảnh báo? Điều này rất quan trọng đối với tôi vì tập lệnh sẽ chạy dưới dạng cron và những cảnh báo đó dẫn đến spam thư rác.

Tôi đang sử dụng mongodbtrình điều khiển trong phiên bản 3.1.0-beta4với @types/mongodbgói tương ứng 3.0.18. Cả hai đều có sẵn mới nhất sử dụng npm install.

Giải pháp thay thế

Sử dụng phiên bản cũ hơn của trình điều khiển mongodb:

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

5
Đó là từ betaphiên bản mà bằng cách nào đó đã được phát hành vào npm cuối tuần qua. Đừng lo lắng về điều đó cho đến khi API thực sự được hoàn thiện. Bạn đã làm đúng việc cài đặt một phiên bản ổn định.
Neil Lunn

1
trên 3.0.0 của mongodb chỉ cần thêm mongoose.connect ("mongodb: // localhost: portnumber / YourDB", {useNewUrlParser: true})
Majedur Rahaman

Câu trả lời:


401

Kiểm tra mongophiên bản của bạn :

mongo --version

Nếu bạn đang sử dụng phiên bản> = 3.1.0, hãy thay đổi mongotệp kết nối của bạn thành ->

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

hoặc tập tin kết nối mongoose của bạn đến ->

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

Lý tưởng nhất, đó là một tính năng phiên bản 4, nhưng v3.1.0 trở lên cũng hỗ trợ nó. Kiểm tra MongoDB GitHub để biết chi tiết.


1
@AbhishekSinha Tại sao với mongo> = 4.0.0? Tôi đang sử dụng 3.6.5 và thông báo gây phiền nhiễu cũng đã biến mất.
chào mừng

Yup đã sửa nó. Về cơ bản, đó là một tính năng v4 nhưng v3.1.0 trở lên cũng hỗ trợ tính năng mới.
Abhishek Sinha

3
Đây là cách tốt nhất, chỉ muốn thêm vào, nếu bạn có một cuộc gọi lại, đặc biệt là lỗi, chỉ cần sử dụng điều này: mongoose.connect (dbUrl, {useNewUrlParser: true}, function (err) {console.log ("mongoDB được kết nối", err);})
ptts

Cảm ơn, Đã sửa như pro
Hidayt Rahman

46

Như đã lưu ý, việc 3.1.0-beta4phát hành trình điều khiển đã "được thả vào tự nhiên" sớm một chút bởi vẻ ngoài của mọi thứ. Bản phát hành là một phần của công việc đang tiến hành để hỗ trợ các tính năng mới hơn trong bản phát hành sắp tới MongoDB 4.0 và thực hiện một số thay đổi API khác.

Một thay đổi như vậy kích hoạt cảnh báo hiện tại là useNewUrlParsertùy chọn, do một số thay đổi xung quanh cách truyền URI kết nối thực sự hoạt động. Thêm về điều đó sau.

Cho đến khi mọi thứ "ổn định", có lẽ nên "ghim" ít nhất là phiên bản nhỏ để 3.0.xphát hành:

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

Điều đó sẽ dừng 3.1.xnhánh được cài đặt trên các cài đặt "mới" cho các mô-đun nút. Nếu bạn đã cài đặt bản phát hành "mới nhất" là phiên bản "beta", thì bạn nên dọn sạch các gói của mình (và package-lock.json) và đảm bảo rằng bạn chuyển 3.0.xbản phát hành đó xuống bản phát hành loạt.

Đối với việc thực sự sử dụng các tùy chọn URI kết nối "mới", hạn chế chính là thực sự bao gồm chuỗi porttrên kết nối:

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

})()

Đó là một quy tắc "nghiêm ngặt" hơn trong mã mới. Điểm chính là mã hiện tại về cơ bản là một phần của mongodbmã kho lưu trữ "trình điều khiển gốc nút" (npm ) và "mã mới" thực sự nhập từ mongodb-corethư viện "củng cố" trình điều khiển nút "công khai".

Điểm của "tùy chọn" được thêm vào là "giảm bớt" quá trình chuyển đổi bằng cách thêm tùy chọn vào mã mới để trình phân tích cú pháp mới hơn (thực sự dựa trên xung quanh url) đang được sử dụng trong mã thêm tùy chọn và xóa cảnh báo không dùng nữa, và do đó xác minh rằng các chuỗi kết nối của bạn được truyền vào thực sự tuân thủ những gì trình phân tích cú pháp mới đang mong đợi.

Trong các bản phát hành trong tương lai, trình phân tích cú pháp 'di sản' sẽ bị xóa và sau đó trình phân tích cú pháp mới sẽ chỉ đơn giản là những gì được sử dụng ngay cả khi không có tùy chọn. Nhưng vào thời điểm đó, dự kiến ​​tất cả các mã hiện tại có nhiều cơ hội để kiểm tra các chuỗi kết nối hiện có của họ so với những gì trình phân tích cú pháp mới đang mong đợi.

Vì vậy, nếu bạn muốn bắt đầu sử dụng các tính năng trình điều khiển mới khi chúng được phát hành, thì hãy sử dụng các betabản phát hành có sẵn và tiếp theo và lý tưởng là đảm bảo bạn đang cung cấp một chuỗi kết nối hợp lệ cho trình phân tích cú pháp mới bằng cách bật useNewUrlParsertùy chọn trong MongoClient.connect().

Nếu bạn thực sự không cần quyền truy cập vào các tính năng liên quan đến bản xem trước của bản phát hành MongoDB 4.0, thì hãy ghim phiên bản vào một 3.0.xloạt như đã lưu ý trước đó. Điều này sẽ hoạt động như tài liệu và "ghim" điều này đảm bảo rằng các 3.1.xbản phát hành không được "cập nhật" so với phụ thuộc dự kiến ​​cho đến khi bạn thực sự muốn cài đặt phiên bản ổn định.


1
Bạn có thêm thông tin về ý của bạn khi bạn nói "phát hành vào tự nhiên" không? 3.1.0-beta4 đã thoát khỏi vườn thú như thế nào? Bạn có thể trích dẫn bất kỳ refs về điều đó?
Wyck

2
@Wyck "Tham chiếu" tất nhiên là tại thời điểm câu hỏi được hỏi, npm install mongodbdẫn đến "beta" (được đánh dấu rõ ràng trong chuỗi phiên bản hiển thị trong câu hỏi) được cài đặt vì nó được đánh dấu là stabletrong kho npm khi nó được đánh dấu không nên Đây thực sự là một lỗi tại thời điểm đó và phải luôn luôn được xem xét vì vậy nếu bất kỳ bản phát hành mã nào hiển thị alphahoặc betatrong chuỗi phiên bản được đánh dấu tương tự là ổn định. Đương nhiên thời gian đã trôi qua và đây là một tính năng trong các bản phát hành ổn định, cho đến khi (như đã lưu ý) cuối cùng nó sẽ biến mất.
Neil Lunn

45

Đoạn mã được tô sáng bên dưới để kết nối cầy mangut đã giải quyết cảnh báo cho trình điều khiển cầy mangut:

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

4
không làm việc cho tôi vẫn nhận được: (nút: 35556) DeprecationWarning: trình phân tích cú pháp chuỗi URL hiện tại không được dùng nữa và sẽ bị xóa trong phiên bản tương lai. Để sử dụng trình phân tích cú pháp mới, hãy chuyển tùy chọn {useNewUrlParser: true} sang MongoClient.connect.
Alex

Bạn phải lưu máy chủ.js hoặc app.js bất cứ nơi nào bạn đang cung cấp đường dẫn DB nếu vẫn không hoạt động thử bằng cách xóa và cài đặt lại node_modules bằng cách nhập cài đặt npm bất cứ khi nào tệp pack.json của bạn
Narendra Maru

24

Không có gì để thay đổi. Chỉ vượt qua trong chức năng kết nối {useNewUrlParser: true }.

Điều này sẽ làm việc:

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

Chỉ cần những gì tôi cần, nhưng thông điệp cảnh báo vẫn còn đó: -S
alex351

Làm việc cho tôi, không có cảnh báo nữa.
Q. Qiao

17

Bạn cần thêm { useNewUrlParser: true }vào phương thức mongoose.connect ().

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

1
câu trả lời này giống như các câu trả lời khác đã được đăng trước đó vài tháng
Daniel W.

Điều này khác với câu trả lời trước như thế nào?
Peter Mortensen

@PeterMortensen vui lòng kiểm tra ngày người đăng câu trả lời đầu tiên
KARTHIKEYAN.A

15

Định dạng chuỗi kết nối phải là mongodb: // user: password @ host: port / db

Ví dụ:

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

Số MongoClient.connect('mongodb://127.0.0.1:27017/yourDB', { useNewUrlParser: true } )hoạt động quá.
Nino Filiu

Điều này khác với câu trả lời trước như thế nào?
Peter Mortensen

15

Bạn chỉ cần đặt những điều sau đây trước khi kết nối với cơ sở dữ liệu như dưới đây:

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

Cũng thế,

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
Nên là câu trả lời hàng đầu. Tất cả các câu trả lời khác cho tôi thất bại thảm hại.
Anthony

Xin đánh dấu ans như correctthể nó đã làm việc cho bạn. Nó làm việc cho tôi là tốt!
Arpan Banerjee

9

Các công việc sau đây cho tôi

const mongoose = require('mongoose');

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

Các mongoosephiên bản là 5.8.10.


1
Điều này cũng làm việc cho tôi. Tôi đang sử dụng--body-parser": "^1.19.0", "express": "^4.17.1", "mongoose": "^5.9.14"
Arpan Banerjee

8

Tôi không nghĩ bạn cần thêm { useNewUrlParser: true }.

Tùy thuộc vào bạn nếu bạn muốn sử dụng trình phân tích cú pháp URL mới. Cuối cùng, cảnh báo sẽ biến mất khi MongoDB chuyển sang trình phân tích cú pháp URL mới của họ.

Như được chỉ định trong Định dạng URI Chuỗi kết nối , bạn không cần đặt số cổng.

Chỉ cần thêm { useNewUrlParser: true }là đủ.


1
Tôi đã thêm số cổng và vẫn nhận được thông báo lỗi. Tôi thấy thông báo lỗi rất khó hiểu và gây hiểu lầm: tại sao tôi nhận được một thông báo bảo tôi sử dụng định dạng mới, trong khi thực tế tôi đang sử dụng định dạng cũ và nó hoạt động hoàn hảo ... !! ??
Nico

2
Câu hỏi hay! Lưu ý rằng đó là một cảnh báo. Không phải là một lỗi. Chỉ bằng cách thêm vàouseNewUrlParser: true , cảnh báo sẽ biến mất. Nhưng điều đó hơi ngu ngốc vì tham số bổ sung này sẽ trở nên lỗi thời một khi mongo chuyển sang trình phân tích cú pháp url mới của họ.
Sam

Làm thế nào bạn biết rằng số cổng là những gì trình phân tích cú pháp url mới mong đợi? Tôi không thể tìm thấy bất cứ điều gì thực sự mô tả trình phân tích cú pháp url mới là gì
Brad

@Brad, thực sự. Tôi đã giả sử bạn cần thêm số cổng, nhưng thông số kỹ thuật Mongo vẫn đề cập đến số cổng là tùy chọn. Tôi cập nhật câu trả lời của tôi cho phù hợp.
Sam

8

Đã cập nhật cho ECMAScript 8 / đang chờ

Mã demo ECMAScript 8 không chính xác mà MongoDB inc cung cấp cũng tạo ra cảnh báo này.

MongoDB cung cấp lời khuyên sau, không chính xác

Để sử dụng trình phân tích cú pháp mới, hãy chuyển tùy chọn {useNewUrlParser: true} sang MongoClient.connect.

Làm điều này sẽ gây ra lỗi sau:

TypeError: đối số cuối cùng executeOperationphải là một cuộc gọi lại

Thay vào đó , tùy chọn phải được cung cấp đểnew MongoClient :

Xem mã dưới đây:

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

Vấn đề có thể được giải quyết bằng cách đưa ra số cổng và sử dụng trình phân tích cú pháp này: {useNewUrlParser: true}

Giải pháp có thể là:

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

Nó giải quyết vấn đề của tôi.


3
Bảng điều khiển tự đưa ra giải pháp để thêm useNewUrlParser propertyvào connect, nhưng giải pháp của bạn đã giúp. Thật tuyệt vời!
ganeshdeshmukh

7

Ví dụ đầy đủ cho Express.js, trường hợp gọi API và gửi nội dung JSON là như sau:

...
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

Đây là cách tôi có nó. Gợi ý không hiển thị trên bảng điều khiển của tôi cho đến khi tôi cập nhật npm một vài ngày trước đó.

.connect có ba tham số, URI, tùy chọn và err.

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

4

Chúng tôi đã sử dụng:

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

→ Điều này gây ra lỗi trình phân tích cú pháp URL

Cú pháp đúng là:

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
Thêm một số mô tả
Mathews Sunny

4

Bạn chỉ cần thêm

{ useNewUrlParser: true }

bên trong phương thức mongoose.connect.


1
Điều này khác với câu trả lời trước như thế nào?
Peter Mortensen

kiểm tra băm.
AGrush

2

Công việc sau đây đối với tôi cho phiên bản 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

Những dòng này cũng có mẹo cho tất cả các cảnh báo khấu hao khác:

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

1

Tôi đã sử dụng mlab.com làm cơ sở dữ liệu MongoDB. Tôi đã tách chuỗi kết nối thành một thư mục khác có tên configvà bên trong tệp key.js Tôi giữ chuỗi kết nối đó là:

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

Và mã máy chủ là

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

Bạn cần viết {useNewUrlParser: true} sau chuỗi kết nối như tôi đã làm ở trên.

Nói một cách đơn giản, bạn cần làm:

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


1

Tôi đang sử dụng mongoose phiên bản 5.x cho dự án của mình. Sau khi yêu cầu gói cầy mangut, hãy đặt giá trị toàn cầu như bên dưới.

const mongoose = require('mongoose');

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

0

Nếu usernamehoặc password@ký tự, sau đó sử dụng nó như thế này:

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));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.