問題の概要MongoDB Atlasから mongodb+srv://username:password@cluster0.mongodb.net/myDatabase のような接続文字列をコピーし、設定ファイルや環境変数に貼り付けて起動したところ、アプリケーションが次のような紛らわしいエラーでクラッシュすることがあります。
Invalid connection string: protocol must be 'mongodb' or 'mongodb+srv'
皮肉なことに、プロトコルはすでに mongodb+srv になっています。このエラーは通常、環境設定の問題、依存関係の不足、またはURI内の不正な文字などが原因で、ドライバーが文字列を正しく解析できていないことを示しています。
主な原因### 1. DNSの依存関係の不足 (Python/PyMongo)Pythonを使用している場合、mongodb+srv プロトコルでSRVレコードを解決するには dnspython パッケージが必要です。これがないと、PyMongoはSRVプロトコルを処理できず、解析エラーをスローします。
2. パスワードに含まれる特殊文字データベースのパスワードに @、:、/、% などの特殊文字が含まれていると、パーサーが混乱します。パスワード内の @ をホスト名の区切り文字と誤認し、プロトコル検出ロジックが失敗することがあります。
3. 環境変数内の隠れた空白や引用符.env ファイルやシェル環境から接続文字列を読み込む際、先頭のスペース、末尾の改行、または文字列の一部となってしまう引用符を誤って含めてしまうことがよくあります。
4. 古いドライバーのバージョンmongodb+srv 形式は MongoDB 3.6 で導入されました。Node.js の mongodb ドライバーの非常に古いバージョン(3.0未満)や Mongoose を使用している場合、このプロトコルは認識されません。
ステップ別の修正方法### 修正1: dnspython のインストール (Pythonユーザー)PyMongoを使用している場合は、ターミナルで次のコマンドを実行してください。
pip install dnspython
または、requirementsファイルを使用している場合は、'srv' エクストラが含まれていることを確認してください。
pip install "pymongo[srv]"
修正2: パスワードのURLエンコードパスワードが P@ssword! の場合、@ 記号がURI構造を壊してしまいます。これらの文字はURLエンコードする必要があります。オンラインツールや簡単なスクリプトを使用してエンコードできます。
- 元:
P@ssword!- エンコード後:P%40ssword%21新しい接続文字列は次のようになります。
mongodb+srv://user:P%40ssword%21@cluster0.mongodb.net/test
修正3: 環境変数のサニタイズNode.jsでは、.env ファイル内で接続文字列を余計な引用符で囲まないようにしてください。次のような記述は避けてください。
# 誤り
MONGO_URI="mongodb+srv://user:pass@cluster.net/db"
代わりに、次のように記述します。
# 正解
MONGO_URI=mongodb+srv://user:pass@cluster.net/db
念のため、コード内で .trim() を呼び出して、誤って混入したスペースを削除するようにします。
const uri = process.env.MONGO_URI.trim();
mongoose.connect(uri);
修正4: ドライバーの更新package.json または requirements.txt を確認してください。古いバージョンを使用している場合は、最新の安定版にアップグレードしてください。
Node.jsの場合:
npm install mongodb@latest mongoose@latest
確認手順修正を確認するには、アプリが動作しているのと同じ環境から MongoDB シェル (mongosh) を使用して接続を試みてください。これにより、問題がネットワークやURIにあるのか、それとも特定のアプリケーションコードにあるのかを切り分けることができます。
mongosh "mongodb+srv://user:pass@cluster0.mongodb.net/dbname"
もし mongosh では正常に接続できるのにアプリでは失敗する場合、原因は間違いなくアプリケーションコードでの文字列の読み込みや渡し方にあります。

