Mongoose: {useUnifiedTopology:true}はMongoDB接続エラーにつながります:MongoTimeoutError:サーバーの選択が30000ミリ秒後にタイムアウトしました

作成日 2019年09月20日  ·  78コメント  ·  ソース: Automattic/mongoose

機能をリクエストしバグを報告しますか?

バグ。

現在の動作は何ですか?

Mongoose 5.7.1に更新した後、次の警告が表示されました。

(node:41563) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
    at parseFn (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/node_modules/mongodb/lib/operations/connect.js:312:5)
    at parseConnectionString (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/node_modules/mongodb/lib/core/uri_parser.js:628:3)
    at connect (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/node_modules/mongodb/lib/operations/connect.js:266:3)
    at ConnectOperation.execute (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/node_modules/mongodb/lib/operations/connect.js:191:5)
    at executeOperation (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/node_modules/mongodb/lib/operations/execute_operation.js:83:26)
    at MongoClient.connect (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/node_modules/mongodb/lib/mongo_client.js:216:10)
    at Promise (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/lib/connection.js:632:12)
    at Promise._execute (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/bluebird/js/release/debuggability.js:313:9)
    at Promise._resolveFromExecutor (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/bluebird/js/release/promise.js:488:18)
    at new Promise (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/bluebird/js/release/promise.js:79:10)
    at NativeConnection.Connection.openUri (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/lib/connection.js:629:19)
    at Mongoose.connect (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/mongoose/lib/index.js:327:15)
    at Object.connect (/Users/tschaffter/dev/PHCCollaborationPortal/server/app.js:17:44)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Module._compile (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/pirates/lib/index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Object.newLoader [as .js] (/Users/tschaffter/dev/PHCCollaborationPortal/node_modules/pirates/lib/index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at Object.<anonymous> (/Users/tschaffter/dev/PHCCollaborationPortal/server/index.js:12:28)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)

MongoDBレプリカセットまたはシャードクラスターを使用していなくても、メッセージに示されているように、mongoose構成オブジェクトにuseUnifiedTopology: trueを追加しました。 マングースを使用して構成および接続する方法は次のとおりです。

`` `mongo:{
オプション:{
// https://mongoosejs.com/docs/deprecations.html
useNewUrlParser:true、
useFindAndModify:false、
useCreateIndex:true、
useUnifiedTopology:true、
reconnectTries:30
reconnectInterval:500、//ミリ秒単位
}
}、

and here is where I used this `mongo.options` object:

// MongoDBに接続します
const mongooseConnectionPromise = mongoose.connect(config.mongo.uri、config.mongo.options);
mongoose.connection.on( 'error'、err => {
console.error( MongoDB connection error: ${err} );
process.exit(-1); // eslint-disable-lineno-process-exit
});

The warning is gone but the issue is that mongoose is now no longer able to connect:

MongoDB接続エラー:MongoTimeoutError:サーバーの選択が30000ミリ秒後にタイムアウトしました
[nodemon]アプリがクラッシュしました-開始する前にファイルの変更を待っています...

Here is how I run MongoDB using docker during development:

docker run -p $ {MONGO_PORT}:$ {MONGO_PORT} --name mongo -d mongo
`` `

現在の動作がバグである場合は、再現する手順を提供してください。

上記を参照

期待される動作は何ですか?

Mongooseが示唆するように、 useUnifiedTopology: trueを使用する場合、Mongooseは非推奨の警告を削除し、正常に実行する必要があります。

使用しているNode.js、Mongoose、MongoDBのバージョンは何ですか?

ノード:v10.16.2
マングース:5.7.1(最新)
MongoDB:dbバージョンv4.2.0

関連する問題:

can't reproduce

最も参考になるコメント

やあ! 私の名前はマットです。MongoDBのドライバーチームに所属しています。 皆様が直面している停止について大変申し訳ありません。この問題について少し更新したいと思います。

現在、非常に外科的なプロセスであることが判明したレガシートポロジタイプを段階的に廃止しようとしています。 これらのタイプを段階的に廃止することで、ドライバーのメンテナンス負担を大幅に軽減でき、ユーザーにとってより安定した効率的なドライバーになることを願っています。 特に、「Unified Topology」を導入する際に、エラーの可能性を減らすために接続プールの書き換えも導入しませんでした。 接続プールは、予想よりもトポロジタイプに緊密に結合されていたため、特にサーバーの監視に関して、いくつかのリグレッションが発生しました。

今朝、私はあなたが直面している問題に対処するはずのドライバーのv3.3.4-rc0をプッシュしました。 このバージョンを試してみて、経験を報告していただければ幸いです。 NODE-2267にこの問題に関連する既存のチケットのそれぞれにコメントを残しましたが、それらを経験した場合は、そこで追加の問題を開いてください。

全てのコメント78件

どのDockerイメージを使用していますか? また、「サーバー選択がタイムアウトしました」メッセージのスタックトレースはありますか?

ねえ、私が同じ問題を抱えていることを報告するためにここを突っ込んでください。

私自身、DockerやVMを使用していません。 また、これは常に発生するわけではないようですが、今日はタイムアウト(30k)のためにデータを取得できず、 useUnifiedTopologyフラグを削除するとすぐに問題が解決しました。 。

Atlasクラスターに接続しています。

マングースは5.7.1です
MongoDbは3.3.2です
ノードは12.9.1です

このように接続する:

mongoose.createConnection(uri,
    {
        useCreateIndex: true,
        useNewUrlParser: true,
        useUnifiedTopology: true, // commented out currently
        dbName: db_name
    });

モデルは次のように作成されます。

import mongoose from 'mongoose';
import * as db_conns from '../db-connections'; // this is an object of connections generated via createConnection

// ... schema definition, for a model called 'article' from a collection called 'article'

// `site_content` is the name of a connection
export default db_conns.connections.site_content.model(`article`, schema, `article`);

次に、次のようにフェッチされます。

// ...
await query.model.find(query_expr).limit(30); // query_expr can change, however even an empty expression ({}) will cause the same issue
// ...

find呼び出しがハングし、タイムアウトエラーが発生します。

@ vkarpov15 MongoDB v4.2.0を提供する最新のmongoイメージを使用しています。
https://hub.docker.com/_/mongo

{useUnifiedTopology:true}を追加した後も同じエラーが発生しますが、エラーはランダムに発生しています。 間違いなく何かが間違っています。 最新のmongo画像を使用しています。

マングース
.connect(process.env.MONGO_URI、{
useUnifiedTopology:true、
useNewUrlParser:true、
})
.then(()=> console.log( 'DB Connected!'))
.catch(err => {
console.log(エラー、err.message);
});
それが始まると、私はコンソールに行きます:
[関数:エラー] {stackTraceLimit:16、prepareStackTrace:undefined}接続0からacccluster-shard-00-01-xx47j.mongodbへ。 ネット:27017クローズ

解決策はありますか? 私でさえ今この問題に直面しています...

同じ問題があります。 私はジュニアプログラマーであり、nodejs-express-graphql-mongoose-mongodbAtlasを使用するのは初めてです。

(ノード:9392)UnhandledPromiseRejectionWarning:MongoTimeoutError:サーバーの選択が30000ミリ秒後にタイムアウトしました
Timeout.setTimeout(MyAppPathgraphql2node_modulesmongodblibcoresdamtopology.js:850:16)
ontimeoutで(timers.js:436:11)
tryOnTimeout(timers.js:300:5)で
listOnTimeout(timers.js:263:5)で
Timer.processTimers(timers.js:223:10)で
(ノード:9392)UnhandledPromiseRejectionWarning:未処理のプロミス拒否。 このエラーは、catchブロックなしで非同期関数の内部をスローするか、.catch()で処理されなかったpromiseを拒否することによって発生しました。 (拒否ID:1)
(node:9392)[DEP0018] DeprecationWarning:未処理のpromise拒否は非推奨になりました。 将来、処理されないpromise拒否は、ゼロ以外の終了コードでNode.jsプロセスを終了します。
events.js:174
投げる; //未処理の「エラー」イベント
^

エラー:ECONNRESETを読み取ります
TLSWrap.onStreamRead(internal / stream_base_commons.js:111:27)で
次の場所で「エラー」イベントが発生しました:
TLSSocketで。(MyAppPathnode_modulesmongodblibcoreconnectionconnection.js:321:10)
Object.onceWrapper(events.js:286:20)で
TLSSocket.emit(events.js:198:13)で
EmmitErrorNT(internal / streams / destroy.js:91:8)で
エミットエラーアンドクローズNT(内部/ストリーム/destroy.js:59:3)
process._tickCallback(internal / process / next_tick.js:63:19)で

useUnifiedTopology有効にした後、本番サーバーでも同じエラーが発生します。

MongoTimeoutError: Server selection timed out after 30000 ms
    at Timeout.setTimeout [as _onTimeout] (/opt/app/node_modules/mongodb/lib/core/sdam/topology.js:850:16)
    at ontimeout (timers.js:498:11)
    at tryOnTimeout (timers.js:323:5)
    at Timer.listOnTimeout (timers.js:290:5)

私は今別の問題に遭遇し始めました
MaxListenersExceededWarning:EventEmitterのメモリリークが検出された可能性があります。 11topologyDescriptionChangedリスナーが追加されました。

この警告を検索したときに、このmongoDBドキュメントに出くわしました
https://jira.mongodb.org/browse/NODE-2123

それは両方のエラーを述べています
「サーバーの選択がタイムアウトしました」と「MaxListenersExceededWarning」があり、どちらのエラーも統合トポロジの変更が原因です。 これは決して言及されなかった破壊的な変化だったと思います。

ライブサーバーでこのエラーが発生したため、{useUnifiedTopology:false}を設定するしかありません。 コミュニティの誰かがこの問題に焦点を合わせて解決するか、解決するための提案を提供してくれることを願っています。

私はまた、(サーバーの選択は30000ミリ秒MaxListenersExceededWarning後にタイムアウトになりました。:可能持つEventEmitterメモリリークが検出された11)の両方のエラーを取得していますこれは私が推測するには、このオプションを使用するすべての人に起こっているようuseUnifiedTopologyを使用した場合。

これを再現しようとしましたが、再現できませんでした。 私はいくつかのオプションを試しました:

1)クエリを実行する直前にサーバーを強制終了する

2)接続が切断された状態でのクエリ

3)クエリを正常に実行する

いずれにせよ、このエラーメッセージはまだ表示されていません。 この問題を示すために、以下のスクリプトを変更していただけますか?

'use strict';

const mongoose = require('mongoose');

run().catch(err => console.log(err));

async function run() {
  mongoose.set('useUnifiedTopology', true);
  mongoose.set('useNewUrlParser', true);

  await mongoose.connect('mongodb://localhost:27017/test');

  const Model = mongoose.model('Test', new mongoose.Schema({ name: String }));

  console.log('Query...');
  await Model.findOne();
  console.log('Done');
}

または、少なくとも、使用しているマングースのバージョンに関する情報を提供してください。 スタンドアロンサーバー、レプリカセット、またはシャードクラスターのいずれを使用しているか。 Mongooseを直接使用しているのか、別のnpmモジュールを介して使用しているのか。

これはマングースの問題ではなく、マングース自体の問題であると私はかなり確信しています。

@ vkarpov15私のコメントを見

@ vkarpov15私にとって、この問題はサーバーの実行中に2〜3日ごとにランダムに発生するため、コードを提供しても、サーバーを継続的に監視する必要があります。

誰かがこの問題を回避しましたか?

誰かがこの問題を回避しましたか?

当分の間、このフラグを使用することはできません。 Mongoは、将来的に無効になるかどうかを警告しますが、当面はこの問題を完全に解決するようです。

誰かがこの問題を回避しましたか?

当分の間、このフラグを使用することはできません。 Mongoは、将来的に無効になるかどうかを警告しますが、当面はこの問題を完全に解決するようです。

フラグuseUnifiedTopology:trueを使用しない場合、このエラーが発生し、アプリが停止します。
マングースのveriosn:5.7.4
Screenshot from 2019-10-10 11-07-11

useUnifiedTopologyをコメントアウトすると、ビルドの問題が解決することを確認できます。 また、(明らかに)ランダムな方法で発生します。

@rpedroni悲しいことに、それは私たちのためではありません...

ここでも起こっています。 本番サーバーは次のメッセージで応答します。 今のところuseUnifiedTopologyにコメントすると思います

MongoDB接続オプション

var options = {
    useCreateIndex: true,
    useNewUrlParser: true,
    useFindAndModify: false,
    useUnifiedTopology: true,
    promiseLibrary: global.Promise
};

サーバーログ

MongoTimeoutError: Server selection timed out after 30000 ms 
Oct 16 12:56:31 app/web.1:     at Timeout.setTimeout (/app/node_modules/mongodb/lib/core/sdam/topology.js:850:16) 
Oct 16 12:56:31 app/web.1:     at Shim.applySegment (/app/node_modules/newrelic/lib/shim/shim.js:1424:20) 
Oct 16 12:56:31 app/web.1:     at Timeout.wrappedCallback [as _onTimeout] (/app/node_modules/newrelic/lib/shim/shim.js:1281:21) 
Oct 16 12:56:31 app/web.1:     at ontimeout (timers.js:436:11) 
Oct 16 12:56:31 app/web.1:     at tryOnTimeout (timers.js:300:5) 
Oct 16 12:56:31 app/web.1:     at listOnTimeout (timers.js:263:5) 
Oct 16 12:56:31 app/web.1:     at Timer.processTimers (timers.js:223:10) 

この問題も発生しており、マングースは使用していません。 Node.js自体のMongoDBドライバーに問題があるようです。 この問題はここでも報告されていますhttps://jira.mongodb.org/browse/NODE-2249
本日公開されたドライバーのバージョン3.3.3は、 MongoTimeoutError詳細を追加する必要があります。 バグ修正のため、ドライバーを更新することもお勧めします。

このエラーは、特定の操作(または初期接続)の読み取り設定を満たすサーバーにドライバーが接続できないために発生します。 これには、接続文字列が無効である、クラスター内のノードがダウンしているなど、さまざまな理由が考えられます。 ドライバーの最新のv3.3.3に更新する場合、問題をさらに調査するのに役立つMongoTimeoutErrorを含む新しい理由フィールドが含まれます。 さらに、このバージョンには、レプリカセットのいずれかのメンバーが使用できない場合に初期接続時にタイムアウトエラーが発生するバグ修正が含まれています。 ドライバを更新し、この問題が引き続き発生する場合はお知らせください。

https://jira.mongodb.org/browse/NODE-2249?focusedCommentId=2485028&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-2485028から引用

ここでも同じですが、開発と本番の両方で発生し、MongoAtlasに接続します:(

また、mongodbatlasに接続するこの問題があります。 通常、アトラスがサーバーの再起動や更新などを行った後に発生します。

そのため、レプリカセットを使用してこれをローカルで再現することはまだできません。 以下のスクリプトは、レプリカセットのフェイルオーバーまたはプライマリの強制終了を行っても、クエリを正常に実行し続けます。 サーバー選択タイムアウトエラーが発生しない:

'use strict';

const mongoose = require('mongoose');

run().catch(err => console.log(err));

async function run() {
  mongoose.set('useUnifiedTopology', true);
  mongoose.set('useNewUrlParser', true);

  await mongoose.connect('mongodb://localhost:27017,localhost:27018,localhost:27019/test?replicaSet=rs');

  const Model = mongoose.model('Test', new mongoose.Schema({ name: String }));


  while (true) {
    console.log(new Date(), 'Query...');
    await Model.findOne();
    await new Promise(resolve => setTimeout(resolve, 5000));
  }
} 

私の最善の推測は、 @ rvanmilの説明が正しいことです。 [email protected] (数時間以内に発送します)にアップグレードして、この問題が解決するかどうかを確認してください。

また、Atlasで再起動をトリガーする方法があるかどうか誰かが知っていますか? たぶん、この問題はAtlasを使用している場合にのみ発生しますか?

@ vkarpov15再起動をトリガーするには、クラスターを一時停止/再開する必要があると思います。 M10 +サイズでのみ可能です。
また、これが代わりにAtlasの問題である可能性があるのではないかと思います。 更新されたMongoDBドライバーをまだテストできていませんが、テストしたらここに報告します。

useUnifiedTopologyフラグに関係なく、今日もAtlasの無料利用枠で同じ問題が発生しています。 エラー: MongoTimeoutError: Server selection timed out after 30000 ms

mLabなどの別のMongoDBサービスを使用して接続を取得できます。

私は同じ問題を抱えていて、それは少しばかげたものになってしまいましたが、それはここで終わる誰かを助けるかもしれないので、とにかくそれを共有します。

MongoTimeoutErrorの「reason」フィールドを確認したところ、「MongoError:bad authAuthenticationfailed」と表示されていました。
そのとき、接続文字列でユーザーパスワードではなくmongoDBパスワードを使用していることに気付きました。
今では正常に動作します。

MongoDB Atlasを使用している場合は、IPアドレスをホワイトリストに登録する必要があります。

ネットワークアクセスに移動し、現在のIPアドレスを編集して、[どこからでもアクセスを許可する]をクリックします。

私はアトラスを使用している間だけこの問題に直面しています。 ホワイトリストに0.0.0.0/0 IPを追加しようとしましたが、機能しませんでした。

私は使っている:

  • マングース:5.7.6
  • ノード:v10.16.3
  • アトラス無料利用枠

ローカルのmongodbサーバーで再現できませんでした。 そこでは、すべてのクエリが正常に機能します。

これはアクセスとは何の関係もありません。 0/0/0/0にアクセスできますが、これが発生します
サーバーがアトラスで再起動するたび。 マルチノードを作ることで再現できます
クラスター(m10 +)とスケジュールされたメンテナンス時間を設定します。 その後、長く実行します
サービスを実行していると、再起動時にエラーが発生するはずです。

2019年10月23日水曜日、午前7時42分Mohammad Mazedul Islam、<
[email protected]>は次のように書いています:

私はアトラスを使用している間だけこの問題に直面しています。 追加してみました
ホワイトリストの0.0.0.0/0IPですが、機能しませんでした。

私は使っている:

  • マングース:5.7.6
  • ノード:v10.16.3
  • アトラス無料利用枠

ローカルのmongodbサーバーで再現できませんでした。 そこでは、すべてのクエリが機能します
正常に。


あなたがコメントしたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/Automattic/mongoose/issues/8180?email_source=notifications&email_token=AAUHUCYYQIQ5U42IBYT7CQTQQA2B7A5CNFSM4IYQ3ZB2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNM
または購読を解除する
https://github.com/notifications/unsubscribe-auth/AAUHUCY5SNFGGCPTGW6GH5DQQA2B7ANCNFSM4IYQ3ZBQ

私もその問題を抱えていました。 しかし、0.0.0.0 / 0と私のIPアドレスの両方をアトラスからホワイトリストに追加した後、問題は解決しました。

〜これはMongoDB Atlasの問題のみです。〜

MongoDBAtlasの使用に問題があります。

通常のMongoDBを使用しても同じ問題が発生します。

docker-composeを使用して、「MongoTimeoutError:サーバーの選択が30000後にタイムアウトした」という状態を正常に再現しました。
https://github.com/anzairyo0127/mongodb-connection-bug

最初にこのアプリケーションを起動します

$ docker-compose up -d
$ docker-compose exec a mongo /tmp/conf/init.js
$ docker-compose exec node sh
$ npm i && npm run build
$ npm run start
> 0times
> waiting ....
> {_id: 5db27454b77b210040f2f84e, id: 1, text: 'hogehoge'}
> 1times
> waiting ....
> {_id: 5db27454b77b210040f2f84e, id: 1, text: 'hogehoge'}
> xtimes
> waiting ....
> {_id: 5db27454b77b210040f2f84e, id: 1, text: 'hogehoge'}
> ......



md5-cc5c53b3c0322ef988c85b63b4bb6c4e



$ docker-compose restart a b c



md5-788ff0ed4e46daf35b1b8594351b929f



> xtimes
> waiting ....
> (node: 4360) UnhandledPromiseRejectionWarning: MongoTimeoutError: Server selection timed out after 30000 ms
> at Timeout.setTimeout [as _onTimeout] (/var/work/node_modules/mongodb/lib/core/sdam/topology.js:878:9)
> at ontimeout (timers.js: 436: 11)
> at tryOnTimeout (timers.js: 300: 5)
> at listOnTimeout (timers.js: 263: 5)
> at Timer.processTimers (timers.js: 223: 10)
> (node: 4360) UnhandledPromiseRejectionWarning: Unhandled promise rejection.This error originated either by throwing inside of an> async function without a catch block, or by rejecting a promise which was not handled with .catch (). (rejection id: 1)
> (node: 4360) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that
> are not handled will terminate the Node.js process with a non-zero exit code.

@ anzairyo0127最新の3.3.3mongodbライブラリで同じことを試すことができますか?

@ rvanmilver3.3.3で再現できます。

このエラーは、mongoDBがレプリケーション構成にあり、インスタンスの1つ(おそらくプライマリインスタンス)がダウンする直前または起動直後にコマンドを受信した場合に発生するようです。
これがMongoDBAtlasで頻繁に発生する理由は、MongoDBAtlasが監視のためにクラスターに定期的にクエリを送信するためだと思います。

解決策はありますか? この問題は...です。

同じ問題が1か月以上続いても、まだ解決されていません-_-

[email protected]更新すると、

@octavioamu詳細を教えていただけますか? 4.2より前に実行していたMongoDBデータベース[クラスター]のバージョンは何ですか? どのバージョンのmongooseおよびmongodbnpmパッケージを使用していて、これらをアップグレードしましたか? このバージョンで解決されたことを確信するために、4.2をどのくらい実行していますか?

申し訳ありませんが、インストールされているバージョンがわかりません。しばらくmongoを使用していなかったため、おそらく非常に古いバージョンです。
マングースバージョンは@ 5.7.7にあります
メッセージは私にとって永続的であり、 mongodb-community @ 4.2 (brew経由でインストール)をインストールすると、メッセージは停止しました。

{useUnifiedTopology: false}を設定すると、認証に失敗します

(node:19948) UnhandledPromiseRejectionWarning: MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoError: Authentication failed.]

{useUnifiedTopology: true}を設定すると、タイムアウトが発生します

(node:20213) UnhandledPromiseRejectionWarning: MongoTimeoutError: Server selection timed out after 30000 ms

パスワードは間違いなく正しいです。 これは、すべての最新バージョンとLSTNode.jsを使用してローカルシステムで再現できます。 ただし、認証なしで接続文字列を使用すると、ローカルで機能しているようです。 したがって、たとえばconst MONGODB_URI = "mongodb://localhost/fullstack"タイムアウトの問題はなくなります。 たぶん、この問題は認証と関係がありますか? これが私のローカルセットアップで問題を再現するMWEです:

const mongoose = require('mongoose')
// const url = 'mongodb://fullstack:fullstack@localhost/fullstack'
const url = 'mongodb://localhost/fullstack'
console.log('Connection url = ', url, 'connecting')
mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true })
console.log('Connected.')
mongoose.connection.close()

MongoDBのセットアップには最新のDockerイメージを使用しました。

ここでも起こっています。 本番サーバーは次のメッセージで応答します。 今のところuseUnifiedTopologyにコメントすると思います

MongoDB接続オプション

var options = {
    useCreateIndex: true,
    useNewUrlParser: true,
    useFindAndModify: false,
    useUnifiedTopology: true,
    promiseLibrary: global.Promise
};

サーバーログ

MongoTimeoutError: Server selection timed out after 30000 ms 
Oct 16 12:56:31 app/web.1:     at Timeout.setTimeout (/app/node_modules/mongodb/lib/core/sdam/topology.js:850:16) 
Oct 16 12:56:31 app/web.1:     at Shim.applySegment (/app/node_modules/newrelic/lib/shim/shim.js:1424:20) 
Oct 16 12:56:31 app/web.1:     at Timeout.wrappedCallback [as _onTimeout] (/app/node_modules/newrelic/lib/shim/shim.js:1281:21) 
Oct 16 12:56:31 app/web.1:     at ontimeout (timers.js:436:11) 
Oct 16 12:56:31 app/web.1:     at tryOnTimeout (timers.js:300:5) 
Oct 16 12:56:31 app/web.1:     at listOnTimeout (timers.js:263:5) 
Oct 16 12:56:31 app/web.1:     at Timer.processTimers (timers.js:223:10) 

ここでも起こっています。 本番サーバーは次のメッセージで応答します。 今のところuseUnifiedTopologyにコメントすると思います

MongoDB接続オプション

var options = {
    useCreateIndex: true,
    useNewUrlParser: true,
    useFindAndModify: false,
    useUnifiedTopology: true,
    promiseLibrary: global.Promise
};

サーバーログ

MongoTimeoutError: Server selection timed out after 30000 ms 
Oct 16 12:56:31 app/web.1:     at Timeout.setTimeout (/app/node_modules/mongodb/lib/core/sdam/topology.js:850:16) 
Oct 16 12:56:31 app/web.1:     at Shim.applySegment (/app/node_modules/newrelic/lib/shim/shim.js:1424:20) 
Oct 16 12:56:31 app/web.1:     at Timeout.wrappedCallback [as _onTimeout] (/app/node_modules/newrelic/lib/shim/shim.js:1281:21) 
Oct 16 12:56:31 app/web.1:     at ontimeout (timers.js:436:11) 
Oct 16 12:56:31 app/web.1:     at tryOnTimeout (timers.js:300:5) 
Oct 16 12:56:31 app/web.1:     at listOnTimeout (timers.js:263:5) 
Oct 16 12:56:31 app/web.1:     at Timer.processTimers (timers.js:223:10) 

私はmongodb atlasを使用していますが、同じ問題に直面しています。

dub-tools-jobs: orders - error MongoTimeoutError: Server selection timed out after 30000 ms 
Oct 29 13:16:30 app/worker.1:      at Timeout.setTimeout [as _onTimeout] (/app/node_modules/mongoose/node_modules/mongodb/lib/core/sdam/topology.js:850:16) 
Oct 29 13:16:30 app/worker.1:     at ontimeout (timers.js:436:11) 
Oct 29 13:16:30 app/worker.1:     at tryOnTimeout (timers.js:300:5) 
Oct 29 13:16:30 app/worker.1:     at listOnTimeout (timers.js:263:5) 
Oct 29 13:16:30 app/worker.1:     at Timer.processTimers (timers.js:223:10) +2m

これはすべて、1つの推奨事項が示唆しているようにuseUnifiedTopologyにコメントすることで起こりました

// mongodb connections
var options = {
    useCreateIndex: true,
    useNewUrlParser: true,
    useFindAndModify: false,
    // useUnifiedTopology: true,      
    promiseLibrary: global.Promise
};

mongooseおよびmongoDBアトラスを使用して、オプションが次のようになっていることを確認します。
mongoose.connect(DATABASE_URL、{useNewUrlParser:true、useUnifiedTopology:true})

この後、タイムアウトが発生した場合は、mongoDBのネットワークアクセスに移動して、mongoDBからIPアドレスをホワイトリストに登録する必要があります

他の人と同様に、このエラーは数日ごとにアプリをクラッシュさせます。これは、IPアドレスへのアクセスやホワイトリストへのアクセスとは無関係であることが確認できます。

私は使っている:

  • マングース:5.7.6
  • ノード:v10.16.3
  • アトラス無料利用枠

今のところ、 useUnifiedTopology: trueもコメントアウトします。 他の人が述べているように、それはAtlasまたはmongoのいずれかに関連しているようです。

これはレプリカセットのMongoDBサーバーの問題であり、MongoDBエンジニアがここで解決策に取り組んでいます。

https://jira.mongodb.org/browse/NODE-2267

@ vkarpov15は、マングースとは何の関係もないため、おそらくこの問題を

何らかの理由で現在のIPアドレスが変更された場合、接続に失敗した場合は、ネットワークアクセスIPホワイトリストで編集し、現在のIPを使用する必要があります。

やあ! 私の名前はマットです。MongoDBのドライバーチームに所属しています。 皆様が直面している停止について大変申し訳ありません。この問題について少し更新したいと思います。

現在、非常に外科的なプロセスであることが判明したレガシートポロジタイプを段階的に廃止しようとしています。 これらのタイプを段階的に廃止することで、ドライバーのメンテナンス負担を大幅に軽減でき、ユーザーにとってより安定した効率的なドライバーになることを願っています。 特に、「Unified Topology」を導入する際に、エラーの可能性を減らすために接続プールの書き換えも導入しませんでした。 接続プールは、予想よりもトポロジタイプに緊密に結合されていたため、特にサーバーの監視に関して、いくつかのリグレッションが発生しました。

今朝、私はあなたが直面している問題に対処するはずのドライバーのv3.3.4-rc0をプッシュしました。 このバージョンを試してみて、経験を報告していただければ幸いです。 NODE-2267にこの問題に関連する既存のチケットのそれぞれにコメントを残しましたが、それらを経験した場合は、そこで追加の問題を開いてください。

3.3.4-rc0で問題が修正されたことを確認できます👍より詳細なテスト結果は後で提供します。

package.jsonのmongodbバージョンをに変更した後
"mongodb": "3.3.4-rc0"、
私はいつもエラーが発生します(mongodbバージョンが3.3.3の場合、このエラーは発生しません):

=============================================
npm ERR! パス/ tmp / app / node_modules / npm / node_modules / abbrev
npm ERR! コードENOENT
npm ERR! errno -2
npm ERR! syscallの名前変更
npm ERR! enoent ENOENT:そのようなファイルまたはディレクトリはありません。名前を「/tmp/app/node_modules/npm/node_modules/abbrev」->「/tmp/app/node_modules/npm/node_modules/.abbrev.DELETE」に変更してください。
npm ERR! enoentこれは、npmがファイルを見つけられないことに関連しています。
npm ERR! enoent
npm ERR! この実行の完全なログは、次の場所にあります。
npm ERR! /home/vcap/.npm/_logs/2019-11-06T17_19_55_661Z-debug.log
[31; 1mエラー[0m依存関係を構築できません:終了ステータス254
ドロップレットのコンパイルに失敗しました:すべての供給スクリプトの実行に失敗しました:終了ステータス14
終了ステータス223

==================================
私のnpmバージョンは6.11.3のnpmです。

このエラーは、この新しいmongodb v3.3.4-rc0ビルドに関連していますか?

@zhenwanこれは、 abbrevパッケージのダウンロードの問題のようです。 package-lock.jsonに問題があると思います。そのファイルを削除して、もう一度npm installを実行してみてください。

次の設定を使用して、エラーを再現し、v3.3.4-rc0ドライバーで解決されたかどうかを確認できました。

  • いくつかのサンプルデータを含むtodo MongoDBコレクションをクエリする単純なhttpapi GET /api/todosを公​​開するNode.jsWebサーバー
  • 私のマシンでローカルに実行されている500msごとにAPIを呼び出すスクリプト
  • スクリプトが実行されたら、MongoDBでフェイルオーバーをトリガーします(プライマリを再起動します)(Atlasでは、[Test Failover]メニューオプションを選択することで、M10クラスターでこれを実行できました)

このテストの結果は次のとおりです。

✅MongodbNode.js 3.3.2 useUnifiedTopology false

> MongoDB failover triggered
> MongoDB 'reconnect' event
> A few http calls with +/- 5000ms response times
> MongoDB failover finished
> Everything back to normal

❌MongodbNode.js 3.3.2 useUnifiedTopology true

> MongoDB failover triggered
> MongoDB 'close' event
> Many MongoNetworkError errors
    {
      "name": "MongoNetworkError",
      "stack": "Error: connect ECONNREFUSED <ip_redacted>:27017
          at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1128:14)",
      "errorLabels": [
        "TransientTransactionError"
      ]
    }
> EventEmitter memory leak warning
    (node:18) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 topologyDescriptionChanged listeners added to [NativeTopology]. Use emitter.setMaxListeners() to increase limit
> Many MongoTimeoutError errors
    {
      "name": "MongoTimeoutError",
      "stack": "MongoTimeoutError: Server selection timed out after 30000 ms
          at Timeout._onTimeout (/app/node_modules/mongodb/lib/core/sdam/topology.js:850:16)
          at listOnTimeout (internal/timers.js:531:17)
          at processTimers (internal/timers.js:475:7)"
    }
> MongoDB failover finished
> Server unable to recover MongoDB connection
> Server restarted manually
> Everything back to normal

⚠️MongodbNode.js 3.3.4-rc0 useUnifiedTopology true

> MongoDB failover triggered
> MongoDB 'reconnect' event expected but not seen
> A few http calls with +/- 5000ms response times
> A couple failed http calls:
    {
      "name": "MongoError",
      "stack": "MongoError: Cache Reader No keys found for HMAC that is valid for time: { ts: Timestamp(1573064656, 1) } with id: 6756219367492419585
          at Connection.<anonymous> (/app/node_modules/mongodb/lib/core/connection/pool.js:451:61)
          at Connection.emit (events.js:210:5)
          at processMessage (/app/node_modules/mongodb/lib/core/connection/connection.js:368:10)
          at TLSSocket.<anonymous> (/app/node_modules/mongodb/lib/core/connection/connection.js:537:15)
          at TLSSocket.emit (events.js:210:5)
          at addChunk (_stream_readable.js:308:12)
          at readableAddChunk (_stream_readable.js:289:11)
          at TLSSocket.Readable.push (_stream_readable.js:223:10)
          at TLSWrap.onStreamRead (internal/stream_base_commons.js:182:23)",
      "ok": 0,
      "errmsg": "Cache Reader No keys found for HMAC that is valid for time: { ts: Timestamp(1573064656, 1) } with id: 6756219367492419585",
      "code": 211,
      "codeName": "KeyNotFound"
    }
> MongoDB failover finished
> Everything back to normal

したがって、 v3.3.4-rc0で動作するようで、サーバーは接続を回復し、MongoDBからのデータの提供を再開できます。 ただし、まだ2つの問題があります。

  • 'reconnect'イベントが欠落しているようです
  • いくつかのリクエストが失敗し、「キャッシュリーダーが時間に対して有効なHMACのキーが見つかりません」というエラーメッセージが表示されます

@mbroadstはい、package-lock.jsonを削除すると、ファイルが見つからないという問題が解決しました。

しかし、それでもエラーが発生します。
2019-11-06T12:52:10.35-0600 [CELL / 0] OUTコンテナが正常になりました
2019-11-06T12:52:39.06-0600 [APP / PROC / WEB / 0] ERR /home/vcap/app/node_modules/connect-mongo/src/index.js:135
2019-11-06T12:52:39.06-0600 [APP / PROC / WEB / 0] ERRスローエラー
2019-11-06T12:52:39.06-0600 [APP / PROC / WEB / 0] ERR ^
2019-11-06T12:52:39.06-0600 [APP / PROC / WEB / 0] ERRエラー:サーバーの選択が30000ミリ秒後にタイムアウトしました
2019-11-06T12:52:39.06-0600 [APP / PROC / WEB / 0] ERR at Timeout.setTimeout [as _onTimeout](/ home / vcap / app / node_modules / connect-mongo / node_modules / mongodb / lib / core /sdam/topology.js:878:9)
2019-11-06T12:52:39.06-0600 [APP / PROC / WEB / 0] ontimeoutでのERR(timers.js:469:11)
2019-11-06T12:52:39.06-0600 [APP / PROC / WEB / 0] tryOnTimeoutでのERR(timers.js:304:5)
2019-11-06T12:52:39.06-0600 [APP / PROC / WEB / 0] Timer.listOnTimeoutでのエラー(timers.js:264:5)
2019-11-06T12:52:39.35-0600 [APP / PROC / WEB / 0] OUT終了ステータス1

@zhenwanは、最初の接続時にクラスターに接続できないことに関連している可能性があるようです。 また、 topology.js:878へのバックトレースは、不思議なことにエラーが生成された場所を指していません。また、正しいタイプMongoTimeoutErrorを受け取っていません。

特定のケースをトリアージできるように、新しいjiraチケットを開いていただけませんか。 ここに貼り付けたものよりも詳細が必要なようです。 ありがとうございました!

@mbroadst
問題の修正にご協力いただきありがとうございます。 私が言いたいのは、v3.3.4-rc0を使用しても私の問題は解決しないということです。 まだこのメッセージが表示されます

MongoTimeoutError: Server selection timed out after 30000 ms
    at Timeout.setTimeout (api/node_modules/mongodb/lib/core/sdam/topology.js:899:9)
    at ontimeout (timers.js:498:11)
    at tryOnTimeout (timers.js:323:5)
    at Timer.listOnTimeout (timers.js:290:5)

私の場合、 loopback-connector-mongodbを使用していますが、 package.json最後のバージョンのmongodbresolutionsを次のように設定しています。

"resolutions": {
    "mongodb": "^3.3.4-rc0"
  }

私の接続パラメータは次のとおりです

"host": "127.0.0.1",
 "port": 27017,
"database": "***",
"password": "***",
"user": "***",
"authSource": "***",
"useNewUrlParser": true,
"enableGeoIndexing": true

以下は私の環境パラメータです

MongoDB server version: 3.6.3 on localhost
yarn v1.19.1
node v8.16.2 

前もって感謝します

アップデート
また、接続パラメーターにuseUnifiedTopology: trueを追加しようとしましたが、同じ結果が得られました。

ここでのもう1つの確認は、マングースを直接使用している人から、 useUnifiedTopology: falseが私に役立つことです。

@mbroadstは、MongoDBの終わりからの更新に感謝します。 私の無知を失礼しますが、mongodb v3.3.4-rc0の前述の修正は、ある時点でマングースにカスケードされますか? 本番環境での回避策として非推奨の機能を採用するという考えには少し不快です。

@mmmmojは、上記の@zhenwanの質問と同様に、スタックトレースは、実際にはv3.3.4-rc0を実行していないことを示しているようです。 たぶんあなたのpackage-lock.json削除してみてください? ケースの詳細を調査できるように提出してください。

@bigsee (man GitHubはあなたの名前を自動入力するのが好きではありません!)それがあなたのために働くと聞いてうれしいです、そしてあなたは更新を歓迎します-私たちのコミュニティは私たちにとって非常に重要です。 @ vkarpov15にリリースのタイミングについて話させますが、私たちは緊密に協力しており、彼はこれをすべて修正することに興味を持っていると確信しています:)

@mbroadst
終わり! ありがとう
ノード-2313

@mbroadst ha! ぎこちない名前でごめんなさい!

エラーがランダムに表示されることを考えると、話が早すぎた可能性があります。 アプリのコールドスタート時に、予想される非推奨の警告とともに、ログに次の少し恐ろしいエラーが表示されます。

Unhandled rejection: { MongoNetworkError: failed to connect to server [myserver.mlab.com:55841] on first connect [{ MongoNetworkError: connection 0 to myserver.mlab.com:55841 timed out
    at Socket.<anonymous> (/var/task/node_modules/mongodb/lib/core/connection/connection.js:335:7)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:106:13)
    at Socket.emit (events.js:208:7)
    at Socket._onTimeout (net.js:420:8)
    at ontimeout (timers.js:482:11)
    at tryOnTimeout (timers.js:317:5)
    at Timer.listOnTimeout (timers.js:277:5) name: 'MongoError', [Symbol(mongoErrorContextSymbol)]: {} }]
    at Pool.<anonymous> (/var/task/node_modules/mongodb/lib/core/topologies/server.js:431:11)
    at emitOne (events.js:116:13)
    at Pool.emit (events.js:211:7)
    at connect (/var/task/node_modules/mongodb/lib/core/connection/pool.js:580:14)
    at callback (/var/task/node_modules/mongodb/lib/core/connection/connect.js:109:5)
    at provider.auth.err (/var/task/node_modules/mongodb/lib/core/connection/connect.js:352:21)
    at _authenticateSingleConnection (/var/task/node_modules/mongodb/lib/core/auth/auth_provider.js:66:11)
    at sendAuthCommand (/var/task/node_modules/mongodb/lib/core/auth/scram.js:177:16)
    at Connection.errorHandler (/var/task/node_modules/mongodb/lib/core/connection/connect.js:321:5)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at Socket.<anonymous> (/var/task/node_modules/mongodb/lib/core/connection/connection.js:333:10)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:106:13)
    at Socket.emit (events.js:208:7)
  name: 'MongoNetworkError',
  errorLabels: [ 'TransientTransactionError' ],
  [Symbol(mongoErrorContextSymbol)]: {} }

以前はMongoTimeoutErrorが、現在はMongoNetworkErrorます... ...何かアイデアはありますか?

@bigseeそのエラーは、統合トポロジを使用していないことを示します。 useUnifiedTopology: trueMongoClient渡して有効にしてください

@mbroadstは正解です。これが、この問題のポイントだと思います。 私がそれについて間違っているならば、謝罪します。

useUnifiedTopology: trueを渡すと、非推奨の警告は消えますが、この問題のタイトルエラーMongoTimeoutError: Server selection timed out after 30000 msアプリがランダムにクラッシュします。

@ vkarpov15などと同様に、この問題を一貫して再現することはできませんでした。 エラーは1日に数回発生し、502と恐ろしいUXのエラーが発生することがあります。 それは新しい問題のようです。

上で報告したように、 useUnifiedTopology: falseを設定する(またはコメントアウトする)回避策は、この問題のエラーを防ぎますが、非推奨の警告を復元し、上記の少し怖いMongoNetworkErrorを復元します。 余談ですが、これは実際に私のアプリを殺すことはありませんが、ある時点でユーザーにとっては死ぬのではないかと心配しています。

@bigsee発生しているMongoNetworkErrorは新しいものではなく、ドライバーがクラスターへの初期接続を確立できなかったことを意味します(ちなみに、アプリの起動とクラスターの起動の間の何らかの競合状態が原因である場合)これであれば、統合トポロジがここでも役立つはずです)。

この問題のポイントは、人々が統合トポロジを使用するためのガイダンスに従っており、使用したときに誤ったタイムアウトエラーが発生していたことです。 v3.3.4-rc0はその特定の問題に対処するためにリリースされたため、現在のガイダンスでは、非推奨の通知を削除し、人々が遭遇した誤ったタイムアウトの問題を修正するバージョンを使用することです。

また、このバージョンでは_all_タイムアウトエラーを防ぐことはできません。 このエラーは、ドライバーがクラスターへの初期接続を実行できないことが原因で発生しています。これは、何らかの構成(接続文字列)またはネットワークエラーを示している可能性があります。 統合トポロジでは、これはMongoTimeoutErrorとして表示され、 reasonフィールドは、初期接続でタイムアウトが発生したネットワークエラーを示します。

@mbroadst前回のコメントで、 MongoNetworkErrorが新しいことを示唆するつもりはなかったので、それがどのように読まれたかをお詫びします。 新しいのは `MongoTimeoutErrorです。 明確にするために、これが私のプロセスです。

  1. アプリにはuseUnifiedTopology: true -すべてが期待どおりに機能しています
  2. アプリがランダムにクラッシュし始め、この問題のタイトルに一致するMongoTimeoutErrorと、上記のスタックトレースの最初の数行が表示されます
  3. グーグル/ SO検索は最終的に私をここに連れて来ます
  4. 提案されたuseUnifiedTopology: false回避策を使用します
  5. MongoTimeoutErrorエラーは、アプリのクラッシュとともに消えます。 ただし、最初は非推奨の警告に置き換えられます。 その後、 useUnifiedTopology: false設定する前に、アプリケーションに表示されない追加のMongoNetworkError useUnifiedTopology: false

おそらく、あなたが示唆しているように、これは因果関係ではなく相関関係です。 私には煙を吐く銃のように見えました。 少なくとも、アプリは現在クラッシュしていません。 非推奨のオプションを残すことを心配しています。

@bigseeああ! 申し訳ありませんが、元のコメントを読み間違えたため、 v3.3.4-rc0バグ修正でv3.3.3問題が解決されたことを確認しました。 新しいバージョンを試す機会がありましたか?

これはMongodbでの私の最初の試行であり、このエラーが発生しています。 コメントを読み、データベースをv3.3.4-rc0に変更しましたが、それでもエラーは修正されませんでした

DeprecationWarning:現在のServer Discovery and Monitoringエンジンは非推奨であり、将来のバージョンで削除される予定です。 新しいサーバー検出および監視エンジンを使用するには、オプション{useUnifiedTopology:true}をMongoClientコンストラクターに渡します。
MongoNetworkError:サーバーへの接続に失敗しました[cluster0-shard-00-00-rhdve.mongodb。 net:27017 ]最初の接続[MongoNetworkError:connection 3 tocluster0-shard-00-00-rhdve.mongodb。 ネット:27017クローズ
TLSSocketで。(C:laragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionconnection.js:356:9)
Object.onceWrapper(events.js:297:20)で
TLSSocket.emit(events.js:209:13)で
net.js:588:12で
TCP.doneで(_tls_wrap.js:479:7){
名前: 'MongoNetworkError'、
errorLabels:[配列]、
}]
プールで。(C:laragonwwwVue-express-mongodbnode_modulesmongodblibcoretopologiesserver.js:433:11)
Pool.emitで(events.js:209:13)
C:laragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionpool.js:562:14で
C:laragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionpool.js:999:9で
コールバック時(C:laragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionconnect.js:109:5)
C:laragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionconnect.js:129:7で
Connection.errorHandlerで(C:laragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionconnect.js:321:5)
Object.onceWrapper(events.js:297:20)で
Connection.emitで(events.js:209:13)
TLSSocketで。(C:laragonwwwVue-express-mongodbnode_modulesmongodblibcoreconnectionconnection.js:354:12){
名前: 'MongoNetworkError'、
errorLabels:['TransientTransactionError']、
}
TypeError:未定義のプロパティ 'find'を読み取ることができません
C:laragonwwwVue-express-mongodbserverroutesapiposts.js:12:26で

@ Syfon01発生しているエラーは、ある種の構成エラーが原因です。ドライバーはレガシートポロジを使用しており、デフォルトの10秒後にクラスターへの初期接続を確立できません。 接続文字列とネットワーク構成を確認し、クラスターに接続できることを確認してください(おそらくmongoシェルを使用)。 それでも問題が発生する場合は、 jiraチケットを開いて、

この問題が発生している場合、Mongo Atlasクラウドインスタンスを使用している場合は、[ネットワークアクセス]タブでIPアドレスが正しく指定されているかどうかを確認してください。

問題が発生しました。ISPがネットワークに再接続するたびに(DHCP)新しいIPを提供するため、MongoAtlasは以前に指定されたIPアドレスのみをホワイトリストに登録していたようです。 これが誰かを助けることを願っています。

更新-機能しません

コードの構造、具体的にはコールバックを次のように変更することで、この問題を解決することができました。

mongoose.connect(DATABASE_URL, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
}).then(() => {
    console.log('Connected to DB');
    app.listen({ port: PORT }, () => {
        console.log(`Server running at http://localhost:${PORT}`)
    });
}).catch(err => console.log(err));
mongoose.connect(DATABASE_URL, { 
    useNewUrlParser: true, 
    useUnifiedTopology: true,
}, () => {
    console.log('Connected to DB');
    app.listen({ port: PORT }, () => {
        console.log(`Server running at http://localhost:${PORT}`);
    });
}).catch(err => console.log(err));

@ mtn2bayは、基本的にpromiseの代わりにコールバック関数を使用しても意味がありません。結果は同じです。唯一の違いは、コールバック関数では、コールバック関数で接続とエラーの両方が発生することです。 .thenと.catchに依存する代わりにログを記録していないため、エラーが発生した場合でも、関数はdbに接続してログを記録し、いずれかの方法でアプリを起動します。 代わりにこれを試してください

mongoose.connect(DATABASE_URL, { 
    useNewUrlParser: true, 
    useUnifiedTopology: true,
}, (err, connection) => {
if(err) {
console.error(err)
return
}    
console.log('Connected to DB');
    app.listen({ port: PORT }, () => {
        console.log(`Server running at http://localhost:${PORT}`);
    })

@khaledosman訂正ありがとうございます。 あなたは正しいです、私はそれを扱うのではなく、ただエラーを無視していました。 私は実際に私のdbパスに問題がありました。

同じ問題に直面していました。mongoosenpmパッケージを5.6.9から5.7.6に更新しましたが、問題は解決しました。

この問題が発生している場合、Mongo Atlasクラウドインスタンスを使用している場合は、[ネットワークアクセス]タブでIPアドレスが正しく指定されているかどうかを確認してください。

問題が発生しました。ISPがネットワークに再接続するたびに(DHCP)新しいIPを提供するため、MongoAtlasは以前に指定されたIPアドレスのみをホワイトリストに登録していたようです。 これが誰かを助けることを願っています。

私の問題を解決しました
UnhandledPromiseRejectionWarning: MongoTimeoutError: Server selection timed out after 30000 ms at Timeout.setTimeout (C:\Users\Umer MIB\Desktop\Chatbots2\mongobot\node_modules\mongodb\lib\core\sdam\topology.js:878:9) at ontimeout (timers.js:436:11) at tryOnTimeout (timers.js:300:5) at listOnTimeout (timers.js:263:5) at Timer.processTimers (timers.js:223:10) (node:4304) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:4304) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code

それがどのように問題を解決したかはわかりませんが、Compassをダウンロードしてデータベースに接続し、リンクをコピーしました。 接続すると、エラーはなくなりました。 トポロジーは私のコードでもまだ真実です。 たぶん、通常のmongodbのインストールでは正しくなかったいくつかのオプションをCompassで構成しました。 これで、コンパスなしで接続でき、すべてが機能しているように見えます。最初に1回だけ接続しました。

私は同じ問題を抱えており、このフォーラムのおかげで、useUnifiedTopology設定にコメントすることで解決しました。 しかし、私はこの設定のコメントを外しましたが、今でも問題なく動作しています...かなり混乱しています...

Mongoose v5.7.11は新しくリリースされたMongoDBドライバー3.3.4を使用しているため、この問題を解決します。 同様のエラーメッセージが表示される場合は、新しい問題を開いて、問題テンプレートに従ってください。

このページは役に立ちましたか?
0 / 5 - 0 評価