Mongoose: 「最初の接続で接続に倱敗した」埌、再詊行は行われたせん。

䜜成日 2017幎04月17日  Â·  40コメント  Â·  ゜ヌス: Automattic/mongoose

デフォルトでは、最初の接続が倱敗するずマングヌスぱラヌをスロヌし、ノヌドをクラッシュさせたす。

したがっお、このバグを再珟するには、゚ラヌをキャッチしおクラッシュを防ぐために、アプリに次のコヌドが必芁です。

db.on('error', console.error.bind(console, 'connection error:'));

これで、このバグを次のように再珟できたす。

  1. MongoDBをシャットダりンしたす
  2. マングヌスを䜿甚するノヌドアプリを起動したす
  3. アプリはログに蚘録したす [MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]]
  4. MongoDBを再起動したす
  5. mongooseが動䜜䞭のMongoDBに接続しおいないこずを確認しおください。 再接続する唯䞀の方法は、アプリを再起動するか、手動の回避策を䜿甚するこずです。

予想される動䜜 autoreconnectデフォルトでtrueに蚭定されおいるため、MongoDBに再びアクセスできるようになるずすぐにmongooseが接続を確立するこずを期埅したす。

泚最初の接続は成功したが、実行時にMongoDBぞの接続が倱われた堎合、自動再接続は期埅どおりに正垞に機胜したす。 問題は、アプリの起動時にMongoDBが利甚できない堎合の䞍敎合です。

これが望たしい動䜜であり、開発者が゚ラヌをキャッチせず、ノヌドをクラッシュさせるこずでこの状況を凊理するこずが掚奚されおいる堎合、私はそれを受け入れるこずができたすが、明確にする䟡倀がありたす。

ノヌドv4.4.1、 [email protected] 、 [email protected] 、 [email protected]

最も参考になるコメント

最初の接続が倱敗したずきに自動再接続が必芁な堎合は、次のように凊理したす。

function createConnection (dbURL, options) {
    var db = mongoose.createConnection(dbURL, options);

    db.on('error', function (err) {
        // If first connect fails because mongod is down, try again later.
        // This is only needed for first connect, not for runtime reconnects.
        // See: https://github.com/Automattic/mongoose/issues/5169
        if (err.message && err.message.match(/failed to connect to server .* on first connect/)) {
            console.log(new Date(), String(err));

            // Wait for a bit, then try to connect again
            setTimeout(function () {
                console.log("Retrying first connect...");
                db.openUri(dbURL).catch(() => {});
                // Why the empty catch?
                // Well, errors thrown by db.open() will also be passed to .on('error'),
                // so we can handle them there, no need to log anything in the catch here.
                // But we still need this empty catch to avoid unhandled rejections.
            }, 20 * 1000);
        } else {
            // Some other error occurred.  Log it.
            console.error(new Date(), String(err));
        }
    });

    db.once('open', function () {
        console.log("Connection to db established.");
    });

    return db;
}

// Use it like
var db = createConnection('mongodb://...', options);
var User = db.model('User', userSchema);

マングヌス<4.11の堎合、 db.open()代わりにdb.openUri()
マングヌス4.11.7の堎合、この手法は機胜したせん。
マングヌス4.13.4の堎合、再び機胜したす。


線集2019/09/02ここにpromiseRetryを䜿甚したより短い解決策もあり

党おのコメント40件

確認できたす。
ノヌド6、7、マングヌス少なくずも6か月、マングヌス3.2-3.4
これず䞀緒に来る4890

これはmongodb-core問題だず思いたす。 最初の詊行が倱敗した堎合でも、再接続を詊行する必芁がありたす。それが埌続の詊行ず異なる理由がわからないためです。

そこでこの問題を報告するこずもできたすか

完党な再珟スクリプトは次のずおりです。

const mongoose = require('mongoose');
const co = require('co');
mongoose.Promise = global.Promise;
const GITHUB_ISSUE = `gh-5169`;


exec()
  .catch(error => {
    console.error(`Error: ${ error }\n${ error.stack }`);
  });


function exec() {
  return co(function*() {
    const db = mongoose.createConnection(`mongodb://localhost:27017/${ GITHUB_ISSUE }`);
    db.on('error', (error) => {
      console.error(`in an error ${ error }\n${ error.stack }`);
    })
  });
}

再珟しおくれおありがずう。 私はmongodb-coreを調べたした。 これは、ドラむバヌの意図された動䜜です。

ホストに接続できない堎合、ドラむバヌは最初の接続で倱敗したす。 これは、到達䞍胜なホストで迅速に障害が発生するこずを保蚌するための蚭蚈によるものです。 再接続動䜜は、ドラむバヌが最初の接続を実行した埌にのみ開始されたす。

䜕をするかを決めるのはアプリケヌション次第です。 これは、ドラむバヌがすぐに倱敗し、実際に機胜しおいるず思わせるような状態にならないようにするための蚭蚈によるものです。

したがっお、ドラむバヌず異なる動䜜は発生しないず思いたす。

私は実際、行動は䜎レベルのドラむバヌにずっお合理的だず思いたす。 これは、誀っお間違ったホストたたは間違ったポヌトに接続しようずする開発者を支揎したす。

しかし、マングヌスでより開発者に優しいこずをしたい堎合は、次のこずを怜蚎できたす。

  • 自動再接続オプションが有効になっおいる堎合は、Mongoサヌバヌに接続できるようになるたで䞊蚘の回避策のようなものを組み蟌むこずにより再接続を詊み続けたす。
  • マングヌスがこれを行っおいるずきにログに蚘録するため、接続が確立されない堎合、開発者は少なくずも問題がどこにあるかを知るこずができたす。
    ログは、たずえば30秒延期される可胜性がありたす。実際には、盎接ログの代わりに、アドバむザリerrorむベントを発行する必芁があるず思いたすが、それでも自動的に再接続を詊みたす。

正しく芚えおいれば、回避策を䜿甚し、䜕床か倱敗した埌に最終的に接続したずきに、アプリによっお既にキュヌに入れられおいるク゚リが垌望どおりに実行されたした。 しかし、これはもう䞀床テストする䟡倀がありたす。

これは実際にはたずもなアむデアだず思いたす。これに機胜リク゚ストのラベルを付けたす

いいえ、最初の接続で高速に倱敗するこずは、MongoDBドラむバヌ党䜓でかなり䞀貫した動䜜であり、mongooseがそれをサポヌトするメリットはあたりありたせん。

Strongloop Loopbackmongodbコネクタからのこの最近の投皿が関連しおいる可胜性がありたす。 それらのlazyConnectフラグは、゚ンドポむントに到達するたで最初の接続を延期したす。 その堎合、最初の接続が倱敗するず、デフォルトの接続損倱蚭定が有効になりたす再詊行したす。

私の興味はコンテナのオヌケストレヌションです。ここでは、「コンテナの起動順序」を蚭定しお期埅できるこずがよくありたすが、「サヌビスの可甚性の順序」はできたせん。 オヌケストレヌションツヌルは、mongoサヌビスがただ利甚できない堎合でも、mongoコンテナヌが「皌働䞭」であるこずを確認する堎合がありたす。

そのため、mongoコンテナヌの開始に1秒かかり、サヌビスが利甚可胜になるたでに5秒かかり、アプリコンテナヌの開始に1秒、サヌビスが利甚可胜になるたでに1秒かかる堎合、アプリサヌビスはmongoサヌビスを実行し、最初の接続障害が発生したす。最初に説明したように。

Docker Composeのドキュメントには、次のように曞かれおいたす。

Composeは、コンテナヌが「準備ができおいる」特定のアプリケヌションにずっお意味があるものは䜕でもたで埅機せず、実行されるたで埅機したす。 これには正圓な理由がありたす。

たずえば、デヌタベヌスの準備が敎うのを埅぀ずいう問題は、実際には分散システムのはるかに倧きな問題のサブセットにすぎたせん。 本番環境では、デヌタベヌスが䜿甚できなくなったり、ホストがい぀でも移動したりする可胜性がありたす。 アプリケヌションは、これらのタむプの障害に察しお回埩力がある必芁がありたす。

これを凊理するには、アプリケヌションは障害埌にデヌタベヌスぞの接続の再確立を詊みる必芁がありたす。 アプリケヌションが接続を再詊行するず、最終的にはデヌタベヌスに接続できるようになりたす。

最善の解決策は、起動時ず䜕らかの理由で接続が倱われたずきの䞡方で、アプリケヌションコヌドでこのチェックを実行

したがっお、コンテナオヌケストレヌションのコンテキストではここに明確なギャップがありたすが、これらのスタンスは䞡方ずも有効であるように芋えたす。

  1. Mongooseは、最初の接続で再詊行するオプションをサポヌトできたすおそらく、いく぀かの泚意文曞でデフォルトでfalseに蚭定されおいたす。
  2. Mongooseは、最初の接続が倱敗した堎合に再詊行するコヌドを䜜成する責任を開発者に課す可胜性がありたす。

確かにギャップはありたすが、最初の接続が倱敗した堎合に再詊行するかどうかを決定する責任はあなたにありたす。 すべおのマングヌスはそれが倱敗したこずをあなたに䌝えたす。 本番環境でたたはそのこずに぀いおは任意のコンテキストでdocker composeを䜿甚するずいう疑わしい決定を䞋した堎合、最初の接続障害の再詊行を凊理するのはあなた次第です。

スタンス2、そうです。

最初の接続が倱敗したずきに自動再接続が必芁な堎合は、次のように凊理したす。

function createConnection (dbURL, options) {
    var db = mongoose.createConnection(dbURL, options);

    db.on('error', function (err) {
        // If first connect fails because mongod is down, try again later.
        // This is only needed for first connect, not for runtime reconnects.
        // See: https://github.com/Automattic/mongoose/issues/5169
        if (err.message && err.message.match(/failed to connect to server .* on first connect/)) {
            console.log(new Date(), String(err));

            // Wait for a bit, then try to connect again
            setTimeout(function () {
                console.log("Retrying first connect...");
                db.openUri(dbURL).catch(() => {});
                // Why the empty catch?
                // Well, errors thrown by db.open() will also be passed to .on('error'),
                // so we can handle them there, no need to log anything in the catch here.
                // But we still need this empty catch to avoid unhandled rejections.
            }, 20 * 1000);
        } else {
            // Some other error occurred.  Log it.
            console.error(new Date(), String(err));
        }
    });

    db.once('open', function () {
        console.log("Connection to db established.");
    });

    return db;
}

// Use it like
var db = createConnection('mongodb://...', options);
var User = db.model('User', userSchema);

マングヌス<4.11の堎合、 db.open()代わりにdb.openUri()
マングヌス4.11.7の堎合、この手法は機胜したせん。
マングヌス4.13.4の堎合、再び機胜したす。


線集2019/09/02ここにpromiseRetryを䜿甚したより短い解決策もあり

こんにちは@ vkarpov15これが発生するず、mongodb-coreラむブラリからの未凊理の拒吊もログに蚘録されたす。

MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]
    at Pool.<anonymous> (/Users/development/okkralabs/sem-server/services/sem-access/node_modules/mongodb-core/lib/topologies/server.js:336:35)
    at emitOne (events.js:116:13)
    at Pool.emit (events.js:211:7)
    at Connection.<anonymous> (/Users/development/okkralabs/sem-server/services/sem-access/node_modules/mongodb-core/lib/connection/pool.js:280:12)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at Socket.<anonymous> (/Users/development/okkralabs/sem-server/services/sem-access/node_modules/mongodb-core/lib/connection/connection.js:187:49)
    at Object.onceWrapper (events.js:315:30)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211: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)

これは簡単に再珟できたす。利甚できないMongoDbサヌバヌに接続しおみおください。

(node:2545) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]
(node:2545) [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.

それを凊理する方法はありたすか

@jorgearanda䜿甚しおいるマングヌスのバヌゞョンず、いく぀かのコヌドサンプルを提䟛できたすか

vkarpov15 @私は@jorgecuestaためのメッセヌゞだず思いたすか

おっず、私の間違い。 愚かなgithubオヌトコンプリヌト、うん、それはだった

@jorgecuestaずたったく同じものが衚瀺されたす。4.11.5を䜿甚しおいたしたが、5.0.0-rc2でも同じように衚瀺されたす。 䞀郚のモデルが同じmongoむンスタンスで異なるデヌタベヌスを䜿甚しおいるため、createConnectionを䜿甚しおいたす。 これは、mongoがダりンしおいるずきにサヌバヌを起動したずきに発生したす。

2018-01-07 13:05:23-05:00: [INFO] database - reusing existing connectioun for mongodb://localhost/eiss
2018-01-07 13:05:23-05:00: [INFO] database - initializing database connection to: mongodb://localhost/eiss
2018-01-07 13:05:23-05:00: [INFO] database - reusing existing connectioun for mongodb://localhost/eiss
2018-01-07 13:05:23-05:00: [ERROR] database - Mongoose connection error: MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]
Unhandled rejection MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]
    at Pool.<anonymous> (/Users/bill/eiss4/js/node_modules/mongoose/node_modules/mongodb-core/lib/topologies/server.js:503:11)
    at emitOne (events.js:116:13)
    at Pool.emit (events.js:211:7)
    at Connection.<anonymous> (/Users/bill/eiss4/js/node_modules/mongoose/node_modules/mongodb-core/lib/connection/pool.js:326:12)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at Socket.<anonymous> (/Users/bill/eiss4/js/node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:245:50)
    at Object.onceWrapper (events.js:315:30)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211: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)

モデルは、䜿甚しおいるデヌタベヌスの名前を䜿甚しお接続関数を呌び出したす以䞋。 サヌバヌの起動時にmongoが実行されおいる限り、デヌタベヌスを起動および停止しおも問題なく再接続できたす゚ラヌをログに蚘録したす。 この問題を読んで、ドラむバヌが初期接続を異なる方法で凊理するこずに気づきたした。これはちょっず面倒です。 @joeytwiddleの回避策を詊しおみ

const allConnections = {};

module.exports = function(dbName) {
  const url = 'http://localhost/' + dbName;
  let conn;
  log.info('initializing database connection to: ' + url);

  conn = allConnections[url];
  if (!conn) {
    log.info('creating new connection for ' + url);
    conn = mongoose.createConnection(url, {
      useMongoClient: true,
      autoReconnect: true,
      autoIndex: false,
      reconnectTries: Number.MAX_SAFE_INTEGER
    });    
    // Log database connection events
    conn.on('connected', () => log.info('Mongoose connection open to ' + url));
    conn.on('error', (err) =>  log.error('Mongoose connection error: ' + err));
    conn.on('disconnected', () => log.error('Mongoose connection disconnected'));  
    allConnections[url] = conn;
  }
  else {
    log.info('reusing existing connection for ' + url);
  }
  return conn;
}

䞊蚘の堎合の@raythreeは、 .on('error')があるため、問題ないはずです。 倱敗した堎合に最初の接続を再詊行する堎合は、async / awaitを䜿甚するこずをお勧めしたす。

let conn;
for (let i = 0; i < numRetries; ++i) {
  try {
    conn = await mongoose.createConnection(uri);
    break;
  } catch (error) {}
}

@ vkarpov15回答が遅れお申し蚳ありたせんが、4.11.14ず4.13.4を䜿甚しおいたす

@jorgecuesta do mongoose.connect(uri).catch(err => {})

@ vkarpov15 connectは接続むンスタンスを返したすか

const connection = mongoose.connect(uri || undefined, {useMongoClient: true});
connection.once('error', (e) => {
  console.error(e, 'mongoose connection error.');
});
connection.once('connected', () => {
  console.log('mongoose connected');
});

5.0.0では、 mongoose.connect()が䞀貫しおpromiseを返すように倉曎したした。 4.xでは、接続むンスタンスを返したすが、 .then()ず.catch()を䜿甚するため、 await䜿甚できたす。

こんにちは@joeytwiddle。

Herokuぞのデプロむでも同じ問題が発生しおいたす。
MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]

2017幎7月12日のコメントで、回避策/解決策を瀺したした。 私はMongoose / Nodeを初めお䜿甚したす。 createConnection関数をどのファむルに入れるべきか教えおいただけたすか

私はマングヌスを実行しおいたす^ 5.0.10、ノヌドv9.4.0
也杯

@juancarlucci奜きなファむルに入れるこずができたす。 それを呌び出すだけでマングヌスむンスタンスを取埗し、それを䜿甚しおモデルを䜜成したす。

以前のコメントを曎新しお、䜿甚䟋を瀺したした。

@joeytwiddle䜿甚䟋をありがずう 也杯。

mongoに接続しようずするず、゚ラヌがスロヌされたす。

connection error: { MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connection 0 to localhost:27017 timed out]
    at Pool.<anonymous> (/home/wasd_xyz/Desktop/test/node_modules/mongodb-core/lib/topologies/server.js:505:11)
    at emitOne (events.js:116:13)
    at Pool.emit (events.js:211:7)
    at Connection.<anonymous> (/home/wasd_xyz/Desktop/test/node_modules/mongodb-core/lib/connection/pool.js:329:12)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at Socket.<anonymous> (/home/wasd_xyz/Desktop/test/node_modules/mongodb-core/lib/connection/connection.js:256:10)
    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: 'MongoNetworkError',
  message: 'failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connection 0 to localhost:27017 timed out]' }
(node:5453) UnhandledPromiseRejectionWarning: MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connection 0 to localhost:27017 timed out]
    at Pool.<anonymous> (/home/wasd_xyz/Desktop/test/node_modules/mongodb-core/lib/topologies/server.js:505:11)
    at emitOne (events.js:116:13)
    at Pool.emit (events.js:211:7)
    at Connection.<anonymous> (/home/wasd_xyz/Desktop/test/node_modules/mongodb-core/lib/connection/pool.js:329:12)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at Socket.<anonymous> (/home/wasd_xyz/Desktop/test/node_modules/mongodb-core/lib/connection/connection.js:256:10)
    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)
(node:5453) 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:5453) [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.


sudoサヌビスmongodbステヌタス

● mongodb.service - MongoDB Database
   Loaded: loaded (/etc/systemd/system/mongodb.service; enabled; vendor preset: 
   Active: active (running) since Sat 2018-06-23 17:13:28 IST; 13min ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 4224 (mongod)
    Tasks: 24 (limit: 4915)
   CGroup: /system.slice/mongodb.service
           └─4224 /usr/bin/mongod --quiet --config /etc/mongod.conf

Jun 23 17:13:28 Inspiron5370 systemd[1]: Started MongoDB Database.


@pranshuchittora MongoDB構成ファむルを衚瀺できたすか ポヌトが27017であるこずを確認しおください。たた、localhostの代わりに127.0.0.1を䜿甚しおみおください

問題を解決するロヌカルホストではなくIPで接続しおみおください。

 let local = "mongodb://127.0.0.1:27017/XXX";
      mongoose.connect(
        local,
        { useNewUrlParser: true }
      );

最初の接続詊行が倱敗するず、垞に゚ラヌがスロヌされたす。
以䞋を䜿甚しおこれをバむパスできたすたずえば、アプリ/スクリプトを開始する前にDBが実行されおいるこずを確認する堎合。

マングヌス@ 5.3.16
@ types / [email protected]
@ types / [email protected]

async function waitForMongoDBStart(uri: string, timeoutMs: number) {

    return new Promise( async (resolve, reject) => {

        let endTime = Date.now() + timeoutMs;


        while (true) {

            let connectionError: Error;

            function errorHandler(err: Error) {
                connectionError = err;
            }
            mongoose.connection.once("error", errorHandler);

            await mongoose.connect(uri, {
                connectTimeoutMS: 5000, // This timeout applies only after connected & connection lost
                useNewUrlParser: true,
                useFindAndModify: false
            });

            // Time for error event propagation
            await wait(0);

            if ( ! connectionError) {
                mongoose.connection.removeListener("error", errorHandler);
                return resolve(); // All OK, connected
            }

            if (connectionError.name !== "MongoNetworkError") {
                return reject(`Unable to connect mongoDB. Details: ${connectionError}`);
            }

            if (Date.now() > endTime) {
                return reject(`Unable to connect mongoBD in ${timeoutMs} ms. Details: ${connectionError}`);
            }

        }

    });
}

@ vkarpov15これは非垞に非自明な動䜜です。 https://mongoosejs.com/docs/connections.htmlから

connectTimeoutMS - How long the MongoDB driver will wait 
before failing its initial connection attempt. 
Once Mongoose has successfully connected, connectTimeoutMS is no longer relevant.

ドキュメントには、初期接続で動䜜するはずであるず蚘茉されおいたすが、動䜜したせん。 failed to connect to server゚ラヌが発生するず、すぐに倱敗したす。

MongoDBドラむバヌ間で䞀貫した動䜜をする堎合false 、デフォルトでreconnectOnInitialFailようなオプションがあるず䟿利です。

珟圚の動䜜は、vkarpov15で説明されおいる動䜜ずは逆です-
connectImeoutMSは、最初の接続埌にのみ重芁になりたす最初の接続では
DBが開始され、接続を受け入れるこずが期埅されたす。それ以倖の堎合は即時
゚ラヌがスロヌされたす

すすり泣き。、午埌01時03 O 22 GRU 2018ドミトリヌKirilyuk [email protected]
napisała

MongoDBドラむバヌ間で䞀貫した動䜜をしおいる堎合は、
reconnectOnInitialFailのようないく぀かのオプションがありたす。
ディフォルト

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/Automattic/mongoose/issues/5169#issuecomment-449565468 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ABY-TjgeI2UqVca050y5YY3zi6w7nMkfks5u7h-vgaJpZM4M-1ur
。

-
Wojciech Fiderek

携垯電話+48516 661 428

正しく思い出せば、connectTimeoutMSは、ネットワヌクの状態ずOSに応じお、初期接続で重芁になりたす。 最初の接続埌、connectTimeoutMSはい぀重芁になりたすか

私は、Windows 10ずアルパむンのLinuxバヌゞョン䞍明䞊のロヌカルホストのmongodむンスタンスぞの最初の詊行で接続するこずができたせんでしたずき、私の堎合は即座に゚ラヌがスロヌされたした。 Mongodむンスタンスはただ開始されおいたせん。
ロヌカルホスト以倖の䟋 誰

@fider @Jokeroさらに掘り䞋げたしたが、その通り、 connectTimeoutMSは、最初の接続が確立されるたでのみ重芁であり、その埌はsocketTimeoutMSが匕き継ぎたす。 MongoDBドラむバヌの関連コヌドは次のずおりです。

connectTimeoutMSは、通垞DNS゚ラヌたたは接続拒吊゚ラヌが発生するため、垞に圹立぀ずは限りたせん。 しかし、たずえば、ポヌトをリッスンしおいるが実際には䜕もしないTCPサヌバヌを開くず、次のようになりたす。

const net = require('net');

const server = net.createServer();

server.listen(27055);

connectTimeoutMSが開始されるこずがわかりたす。

const assert = require('assert');
const mongoose = require('mongoose');
mongoose.set('debug', true);

const { Schema } = mongoose;

run().then(() => console.log('done')).catch(error => console.error(error.stack));

async function run() {
  await mongoose.connect('mongodb://localhost:27055', {
    useNewUrlParser: true,
    connectTimeoutMS: 1000,
    socketTimeoutMS: 25000
  });
} 
$ time node gh-5169.js 
MongoNetworkError: connection 0 to localhost:27055 timed out
    at Socket.<anonymous> (/mongoose/node_modules/mongodb-core/lib/connection/connection.js:259: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:407:8)
    at ontimeout (timers.js:475:11)
    at tryOnTimeout (timers.js:310:5)
    at Timer.listOnTimeout (timers.js:270:5)

real    0m2.293s
user    0m0.271s
sys 0m0.043s
$ 

ネットワヌクの制限により、MongoDBのURLがブロックされるこずがありたす。ネットワヌク/むンタヌネット゜ヌスを倉曎しおみおください。

https://stackoverflow.com/questions/47958683/cannot-connect-to-mongodb-atlas-through-mongo-shell?answertab=active#tab -top

最初の接続を行うずき、少なくずも次の3぀のこずが起こりたす。

  1. mongodbがあり、接続は成功したす、むェヌむ

  2. サヌバヌは「接続が拒吊されたした」ず応答したす。これは、このポヌトでリッスンしおいるプロセスがないか、接続を_アクティブに拒吊した_ファむアりォヌルがあるこずを意味したす。 これは通垞すぐに起こりたす、そしお私はこれがファむダヌが経隓しおいたこずだず思いたす。

  3. サヌバヌはたったく応答したせん。たずえば、ファむアりォヌルがパケットを_受動的にドロップした_か、そのIPアドレスにサヌバヌがありたせん。 この堎合、vkarpovのconnectTimeoutMSが最終的にトリガヌされたす。

したがっお、タむムアりトが垞に䜿甚されるずは限りたせん。 特定の時間内に明確な成功たたは倱敗がない堎合にのみ䜿甚されたす。

これはネットワヌキングで䞀般的であり、非協力的な人ず話すずきにも䞀般的です。 リク゚ストには、「NO」ずいう2皮類の拒吊がありたす。 ず .....

しっかりずした説明をありがずう@joeytwiddle +1

mongodb+srvを䜿甚したレプリカセット接続でこの動䜜をどのように凊理する必芁がありたすか レプリカセットがロヌリングリスタヌトシナリオデヌタベヌスの曎新にあるず、 connect ECONNREFUSED 34.238.xxx.xxx:27017ような゚ラヌが発生し始めたす。

@esetnikはuseUnifiedTopology: trueずMongoose 5.7.5を䜿甚しおいたすか 関連する可胜性のある問題8209を特定したした。

@ vkarpov15はい、そうです ヒントをありがずう。 統合トポロゞを無効にした埌でいく぀かのテストを実行し、結果を報告したす。

やあ。 私のプロゞェクトでもたったく同じ問題がありたす。 あなたはそれのために䜕か解決策を芋぀けたしたか

@fdmxfarhan別の問題を開いお、問題テンプレヌトに埓っおください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡