Sửa lỗi MongoDB: "Invalid connection string: protocol must be 'mongodb' or 'mongodb+srv'"

beginner🍃 MongoDB2026-05-18| Node.js (Mongoose/MongoDB Driver), Python (PyMongo), Docker, Linux, macOS, Windows

Error Message

Invalid connection string: protocol must be 'mongodb' or 'mongodb+srv'
#mongodb#chuỗi-kết-nối#dns#mongodb+srv

Vấn đềBạn đã sao chép chuỗi kết nối từ MongoDB Atlas, trông giống như mongodb+srv://username:password@cluster0.mongodb.net/myDatabase. Bạn dán nó vào tệp cấu hình hoặc biến môi trường, nhấn bắt đầu và ứng dụng bị lỗi với thông báo khó hiểu này:

Invalid connection string: protocol must be 'mongodb' or 'mongodb+srv'

Điều trớ trêu là giao thức đãmongodb+srv. Lỗi này thường cho thấy trình điều khiển (driver) không thể phân tích cú pháp chuỗi một cách chính xác, thường do sự cố cấu hình môi trường, thiếu dependency hoặc có các ký tự không hợp lệ trong URI.

Các nguyên nhân gốc rễ phổ biến### 1. Thiếu các Dependency DNS (Python/PyMongo)Nếu bạn đang làm việc với Python, giao thức mongodb+srv yêu cầu gói dnspython để phân giải các bản ghi SRV. Nếu không có nó, PyMongo không thể xử lý giao thức SRV và sẽ đưa ra lỗi phân tích cú pháp.

2. Ký tự đặc biệt trong mật khẩuNếu mật khẩu cơ sở dữ liệu của bạn chứa các ký tự đặc biệt như @, :, /, hoặc %, trình phân tích cú pháp sẽ bị nhầm lẫn. Nó có thể hiểu nhầm ký tự @ trong mật khẩu là dấu phân cách cho hostname, khiến logic phát hiện giao thức bị lỗi.

3. Khoảng trắng ẩn hoặc dấu ngoặc kép trong biến môi trườngKhi tải chuỗi kết nối từ tệp .env hoặc môi trường shell, người dùng thường vô tình bao gồm một khoảng trắng ở đầu, ký tự xuống dòng ở cuối hoặc các dấu ngoặc kép thực tế vốn sẽ trở thành một phần của chuỗi.

4. Phiên bản Driver đã lỗi thờiĐịnh dạng mongodb+srv được giới thiệu từ MongoDB 3.6. Nếu bạn đang sử dụng phiên bản driver mongodb cho Node.js rất cũ (trước 3.0) hoặc Mongoose cũ, nó sẽ không nhận diện được giao thức này.

Các bước khắc phục chi tiết### Cách 1: Cài đặt dnspython (Dành cho người dùng Python)Nếu bạn đang sử dụng PyMongo, hãy chạy lệnh sau trong terminal của bạn:

pip install dnspython

Hoặc, nếu bạn sử dụng tệp requirements, hãy đảm bảo bạn đã bao gồm phần mở rộng 'srv':

pip install "pymongo[srv]"

Cách 2: Mã hóa URL cho mật khẩuNếu mật khẩu của bạn là P@ssword!, ký tự @ sẽ làm hỏng cấu trúc URI. Bạn phải mã hóa URL cho các ký tự này. Bạn có thể sử dụng công cụ trực tuyến hoặc một đoạn mã nhanh để mã hóa.

  • Gốc: P@ssword!- Đã mã hóa: P%40ssword%21Chuỗi kết nối mới của bạn sẽ trông như thế này:
mongodb+srv://user:P%40ssword%21@cluster0.mongodb.net/test

Cách 3: Làm sạch các biến môi trườngTrong Node.js, hãy đảm bảo bạn không bao bọc chuỗi kết nối của mình trong các dấu ngoặc kép dư thừa bên trong tệp .env. Đừng làm như thế này:

# SAI
MONGO_URI="mongodb+srv://user:pass@cluster.net/db"

Thay vào đó, hãy làm thế này:

# ĐÚNG
MONGO_URI=mongodb+srv://user:pass@cluster.net/db

Để an toàn, hãy thêm một lệnh gọi .trim() trong mã của bạn để loại bỏ các khoảng trắng vô tình có mặt:

const uri = process.env.MONGO_URI.trim();
mongoose.connect(uri);

Cách 4: Cập nhật DriverKiểm tra tệp package.json hoặc requirements.txt của bạn. Nếu bạn đang ở phiên bản cũ, hãy nâng cấp lên bản phát hành ổn định mới nhất.

Đối với Node.js:

npm install mongodb@latest mongoose@latest

Các bước xác minhĐể xác nhận việc khắc phục, hãy thử kết nối qua MongoDB Shell (mongosh) từ cùng môi trường mà ứng dụng của bạn đang chạy. Điều này giúp xác định vấn đề nằm ở mạng/URI hay ở mã ứng dụng cụ thể của bạn.

mongosh "mongodb+srv://user:pass@cluster0.mongodb.net/dbname"

Nếu mongosh kết nối thành công nhưng ứng dụng của bạn thì không, vấn đề chắc chắn nằm ở cách mã ứng dụng của bạn đang đọc hoặc truyền chuỗi kết nối.

Bài học kinh nghiệm- Luôn mã hóa thông tin đăng nhập: Coi các URI kết nối như các URL. Bất kỳ ký tự nào có ý nghĩa đặc biệt trong URL đều phải được escape.- Làm sạch đầu vào (Trim): Khi đọc từ các biến môi trường, luôn cắt bỏ khoảng trắng thừa ở hai đầu chuỗi kết quả để ngăn chặn các lỗi do ký tự ẩn gây ra.- Dependency rất quan trọng: Các bản ghi SRV yêu cầu khả năng tra cứu DNS cụ thể mà không phải lúc nào cũng được tích hợp sẵn trong driver cơ sở (đặc biệt là trong Python).- Kiểm tra nhật ký (logs): Đôi khi thông báo lỗi chỉ là một phản hồi chung chung. Việc in chuỗi kết nối ra (đã che mật khẩu!) ngay trước khi thực hiện kết nối có thể giúp phát hiện xem nó có bị làm sai lệch bởi bộ nạp cấu hình hay không.

Related Error Notes