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#connection-string#dns#mongodb+srv

問題の概要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 では正常に接続できるのにアプリでは失敗する場合、原因は間違いなくアプリケーションコードでの文字列の読み込みや渡し方にあります。

学んだ教訓- 認証情報は常にエンコードする: 接続URIはURLとして扱います。URL内で特別な意味を持つ文字は必ずエスケープする必要があります。- 入力をトリミングする: 環境変数から読み込む際は、目に見えない文字によるバグを防ぐため、常に取得した文字列をトリミングしてください。- 依存関係の重要性: SRVレコードには特定のDNSルックアップ機能が必要ですが、これらは必ずしもベースドライバーに組み込まれているわけではありません(特に Python の場合)。- ログを確認する: エラーメッセージが一般的な内容である場合があります。接続を試みる直前に接続文字列を(パスワードをマスクした状態で!)出力すると、設定ローダーによって文字列が壊されていないか確認できます。

Related Error Notes