34

だから私は現在Webアプリケーションを作成していて、データベースが必要なので、mongodbとmongooseを使うことにしました。今まで、localhost ですべてをテストして動作しましたが、データをサーバーに移動したかったのです。私は Atlas のことを聞いて登録し、データを「アップロード」しました。

ここで、node.js アプリを介してクラスターに接続したいと考えています。

mongoose.connect('mongodb+srv://engllucas:p%40ssw0rd@insight-quhku.mongodb.net/test');

Connect Your Applicationの時点で mongodb Atlas サイトの文字列を取得しました

次に、パスワードを交換しました。

mongoose.connect('mongodb://engllucas:p%40ssw0rd@insight-quhku.mongodb.net/test');

これもうまくいきませんでした。

エラーメッセージは次のとおりです。

{ MongoError: failed to connect to server [insight-shard-00-02-quhku.mongodb.net:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 18.194.163.64:27017]
at Pool.<anonymous> (U:\WEBT\ProjectInsight\Quiz\node_modules\mongodb-core\lib\topologies\server.js:503:11)
at emitOne (events.js:115:13)
at Pool.emit (events.js:210:7)
at Connection.<anonymous> (U:\WEBT\ProjectInsight\Quiz\node_modules\mongodb-core\lib\connection\pool.js:326:12)
at Object.onceWrapper (events.js:318:30)
at emitTwo (events.js:125:13)
at Connection.emit (events.js:213:7)
at TLSSocket.<anonymous> (U:\WEBT\ProjectInsight\Quiz\node_modules\mongodb-core\lib\connection\connection.js:245:50)
at Object.onceWrapper (events.js:316:30)
at emitOne (events.js:115:13)
at TLSSocket.emit (events.js:210:7)
at emitErrorNT (internal/streams/destroy.js:64:8)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
  name: 'MongoNetworkError',

メッセージ: '最初の接続でサーバー [insight-shard-00-02-quhku.mongodb.net:27017] に接続できませんでした [MongoNetworkError: connect ECONNREFUSED 18.194.163.64:27017]' } (ノード:4920) UnhandledPromiseRejectionWarning: 未処理の約束拒否 (拒否 ID: 1): MongoNetworkError: 最初の接続でサーバー [insight-shard-00-02-quhku.mongodb.net:27017] に接続できませんでした [MongoNetworkError: connect ECONNREFUSED 18.194.163.64:27017] (ノード:4920 ) [DEP0018] DeprecationWarning: 未処理の promise 拒否は非推奨です。今後、処理されないプロミスの拒否は、ゼロ以外の終了コードで Node.js プロセスを終了します。

4

19 に答える 19

5

バージョン 5.0.15 より前の mongoose を使用している場合:

uri は、 mongodb+srv:// 基になるネイティブ ドライバーに対して有効ではありません

+srv を削除するだけでは機能しません。URI にはレプリカ ホストと replicaSet/authSource パラメータを含める必要があるためです。

あなたはどちらかをすることができます

1. mongoose 5.0.15 にアップグレードし、短い +srv 形式を使用します

また

2. Atlas クラスター ダッシュボードの完全な URI で現在のバージョンを使用し、古いドライバー(以下のを参照)バージョンの URI を選択します。

クラスター ダッシュボードから接続ボタンを押してから (ノード サーバーの IP をホワイトリストに登録していると仮定します)、[アプリケーションを接続する] を選択し、[3.4 ドライバーまたはそれ以前を使用しています] を押します。結果の uri 文字列を使用して、パスワードを置き換えます。

注: Atlas クラスター ダッシュボードの接続ヘルパーで URI 文字列を選択するためのダイアログで、"I am using driver 3.* or (newer|older)" と表示されます。3.6 と 3.4 はドライバーのバージョンではなく、サーバーのバージョンを指すため、これは不適切な言葉の選択です。さらに、サーバーのいずれかのバージョンを使用することは、接続に使用されるドライバーとは関係ありません。使用する URI のバージョンを決定する実際の依存関係はドライバーにあります。

于 2018-04-18T08:58:00.883 に答える
2

ホットスポットに接続していて、すべてが正しく行われたと思われる場合は、切断して再接続してください。特に、インターネット接続をオフにしてから再接続してください。

于 2020-05-11T08:46:11.007 に答える
1

私もこの同様の問題を抱えていました。その後変更

mongoose.connect(db, () => { }, { useNewUrlParser: true })
    .catch(err => {console.log(err);});

エラーが発生しましたが、

(ノード:5796) DeprecationWarning: 現在の URL 文字列パーサーは非推奨であり、将来のバージョンでは削除される予定です。新しいパーサーを使用するには、オプション { useNewUrlParser: true } を MongoClient.connect に渡します。

次に、コードを次のように変更しました

mongoose.connect(db, { useNewUrlParser: true, useUnifiedTopology: true }, () => { })
        .catch(err => console.log(err));

これは私にとってはうまくいきました。

于 2020-05-09T19:51:30.490 に答える
0

IPホワイトリストが正しく設定されていても、同じ問題がありました!

その理由は、MongoDB Enterprise Atlas が SSL 暗号化レイヤーを必要とし、それなしで接続しようとすると、次のような合理的でなく自明ではないエラーが生成されるためです。

Failed to connect to mongodb-m0-nnxxx.mongodb.net:27017
No chance to Authorize

IP ホワイトリストが問題である mondodb クライアントを使用して接続しようとすると、次のようなエラー メッセージが表示されます。

mongo "mongodb+srv://mongodb-m0-nnxxx.mongodb.net/test" --username admin

DBClientConnection failed to receive message from mongodb-m0-shard-00-00-nnxxx.mongodb.net.:27017 - HostUnreachable: Connection closed by peer
Unable to reach primary for set mongodb-m0-shard-0
Cannot reach any nodes for set mongodb-m0-shard-0. Please check network connectivity and the status of the set. This has happened for 5 checks in a row.

たとえば、Robo 3T クライアントを使用する場合、[ SSL プロトコルを使用する] チェックボックスを有効にし、**認証方法: 自己署名証明書**を有効にする必要があります。

テストは次の診断出力を生成します。

v Connected to mongodb-m0-nnxxx.mongodb.net:27017 via SSL tunnel
v Authorized on admin database as admin

これが誰かに役立つことを願っています。

于 2019-08-14T13:18:59.640 に答える