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 đã là 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.

