node.js - Tránh cảnh báo "trình phân tích chuỗi URL hiện tại đã lỗi thời" bằng cách đặt useNewUrlParser thành true
Tôi có một lớp bao quanh cơ sở dữ liệu mà thiết lập kết nối với một instance MongoDB nào đó:
async connect(connectionString: string): Promise<void> {
this.client = await MongoClient.connect(connectionString)
this.db = this.client.db()
}
Điều này đã cảnh báo tôi:
(node:4833) Cảnh báo Ngừng hỗ trợ: Trình phân tích chuỗi URL hiện tại đã bị ngừng hỗ trợ và sẽ bị loại bỏ trong phiên bản tương lai. Để sử dụng trình phân tích mới, hãy truyền tùy chọn { useNewUrlParser: true } cho MongoClient.connect.
Phương thức connect() chấp nhận một đối tượng MongoClientOptions làm đối số thứ hai. Nhưng nó không có thuộc tính nào gọi là useNewUrlParser. Tôi cũng đã thử đặt thuộc tính đó trong chuỗi kết nối như sau: mongodb://127.0.0.1/my-db?useNewUrlParser=true nhưng nó không ảnh hưởng đến những cảnh báo đó.
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 quan trọng với tôi vì tập lệnh nên chạy theo cron và những cảnh báo đó dẫn đến spam thư rác.
Tôi đang sử dụng trình điều khiển mongodb phiên bản 3.1.0-beta4 cùng với gói @types/mongodb tương ứng ở phiên bản 3.0.18. Cả hai đều là phiên bản mới nhất có thể cài đặt bằng npm install.
Giải pháp tạm thời
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"
Câu trả lời #1
Kiểm tra phiên bản mongo 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 tệp kết nối mongo của bạn thành ->
MongoClient.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true })
hoặc tệp kết nối mongoose của bạn đến ->
mongoose.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true });
Lý tưởng nhất, đây là một tính năng của phiên bản 4, nhưng v3.1.0 trở lên cũng hỗ trợ nó. Xem GitHub của MongoDB để biết chi tiết.
Câu trả lời số 2
Như đã lưu ý, phiên bản 3.1.0-beta4 của driver đã được “phát hành ra công chúng” hơi sớm theo những gì trông thấy. Phiên bản phát hành này 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 của MongoDB 4.0 và thực hiện một số thay đổi API khác.
Một thay đổi như vậy gây ra cảnh báo hiện tại là tùy chọn useNewUrlParser, do một số thay đổi liên quan đến cách việc truyền URI kết nối thực sự hoạt động. Sẽ nói thêm về điều đó sau.
Cho đến khi mọi thứ "ổn định", có lẽ nên khuyến nghị "ghim" ít nhất vào phiên bản nhỏ cho các bản phát hành 3.0.x:
"dependencies": {
"mongodb": "~3.0.8"
}
Điều đó sẽ ngăn nhánh 3.1.x được cài đặt trên các bản cài đặt "mới" vào các mô-đun node. Nếu bạn đã cài đặt một phiên bản "mới nhất" là phiên bản "beta", thì bạn nên dọn dẹp các gói của mình (và package-lock.json) và đảm bảo hạ nó xuống phiên bản 3.0.x.
Còn về 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à phải thực sự bao gồm port trong chuỗi 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 mã kho lưu trữ 'node-native-driver' (npm `mongodb`), và 'mã mới' thực sự nhập từ thư viện `mongodb-core` mà 'làm nền tảng' cho driver node 'công khai'.
Mục đích của việc thêm "tùy chọn" là để "dễ dàng" 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 url) được sử dụng trong mã thêm tùy chọn và xóa cảnh báo lỗi thời, và do đó xác minh rằng các chuỗi kết nối mà bạn 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 phiên bản phát hành tương lai, trình phân tích cú pháp 'di sản' sẽ bị loại bỏ và sau đó trình phân tích cú pháp mới sẽ được sử dụng mà không cần tùy chọn. Nhưng vào thời điểm đó, dự kiến rằng tất cả mã hiện có đều đã có cơ hội đầy đủ để kiểm tra các chuỗi kết nối hiện tại của họ so với những gì mà 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 mới của driver ngay khi chúng được phát hành, hãy sử dụng các bản beta hiện có và các bản phát hành tiếp theo, và lý tưởng nhất là đảm bảo rằng 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 tùy chọn useNewUrlParser trong MongoClient.connect().
Nếu bạn thực sự không cần truy cập các tính năng liên quan đến bản xem trước của phiên bản MongoDB 4.0, thì hãy cố định phiên bản vào chuỗi 3.0.x như đã đề cập trước đó. Điều này sẽ hoạt động như được ghi chép và việc "cố định" này đảm bảo rằng các bản phát hành 3.1.x sẽ không bị "cập nhật" vượt quá phụ thuộc dự kiến cho đến khi bạn thực sự muốn cài đặt một phiên bản ổn định.
Câu trả lời #3
Đoạn mã được tô sáng bên dưới cho kết nối mongoose đã giải quyết cảnh báo cho driver mongoose:
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
Câu trả lời #4
Không có gì để thay đổi. Chỉ truyền trong hàm connect {useNewUrlParser: true }.
Điều này sẽ hoạt động:
MongoClient.connect(url, {useNewUrlParser:true,useUnifiedTopology: true }, function(err, db) {
if(err) {
console.log(err);
}
else {
console.log('connected to ' + url);
db.close();
}
})
Câu trả lời số 5
Bạn chỉ cần thiết lập các mục sau 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 vậy,
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().
Câu trả lời số 6
Bạn cần thêm { useNewUrlParser: true } trong phương thức mongoose.connect().
mongoose.connect('mongodb://localhost:27017/Notification',{ useNewUrlParser: true });
Câu trả lời số 7
Định dạng chuỗi kết nối phải là mongodb://user:password@host:port/db
Ví dụ:
MongoClient.connect('mongodb://user:[email :27017/yourDB', { useNewUrlParser: true } )
Câu trả lời số 8
Những điều sau đây phù hợp với tôi
const mongoose = require('mongoose');
mongoose.connect("mongodb://localhost/playground", { useNewUrlParser: true,useUnifiedTopology: true })
.then(res => console.log('Connected to db'));
Phiên bản mongoose là 5.8.10.
