MongoDB接続エラー:MongoTimeoutError:サーバー選択が30000ミリ秒後にタイムアウトしました


11

次のチュートリアルを読んでフルスタックアプリを作成しようとしています。

https://medium.com/javascript-in-plain-english/full-stack-mongodb-react-node-js-express-js-in-one-simple-app-6cc8ed6de274

私はすべてのステップに従い、実行しようとしました:

node server.js

しかし、私は次のエラーを受け取りました:

MongoDB接続エラー:MongoTimeoutError:Timeout._onTimeout(C:\ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js:308:9)at listOnTimeout(internal / timers.js:531:17)at processTimers(internal / timers.js:475:7){name: 'MongoTimeoutError'、reason:Error:connect ETIMEDOUT 99.80.11.208:27017 at TCPConnectWrap.afterConnect [as oncomplete](net。 js:1128:14){name: 'MongoNetworkError'、[Symbol(mongoErrorContextSymbol)]:{}}、[Symbol(mongoErrorContextSymbol)]:{}}(node:42892)UnhandledPromiseRejectionWarning:MongoTimeoutError:30000ミリ秒後にサーバーの選択がタイムアウトしましたTimeout._onTimeout(C:\ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js:308:9)listOnTimeout(internal / timers.js:531:17)at processTimers(internal / timers.js:475:7)

server.jsでの私のコードは次のとおりです。

const mongoose = require('mongoose');
const router = express.Router();

// this is our MongoDB database
const dbRoute =
    'mongodb+srv://user:<password>@cluster0-3zrv8.mongodb.net/test?retryWrites=true&w=majority';

mongoose.Promise = global.Promise;

// connects our back end code with the database
mongoose.connect(dbRoute, 
    {   useNewUrlParser: true,
        useUnifiedTopology: true
    });

let db = mongoose.connection;

db.once('open', () => console.log('connected to the database'));

助言がありますか?


1
接続文字列に変更user:passwordしましたusername and passwordか?
Shivam Sood

@ShivamSoodはい、そうしました
Arvind Krmar

情報を追加するために、MongoDBコンパスコミュニティを使用して接続しようとしましたが、同じエラーが発生しました。atLas Mongodbでの設定はありますか?
Arvind Krmar

2
アプリケーションはローカルのMongoDB "mongodb://127.0.0.1/FullStack"で正常に実行されています。Atlas MongoDBへの接続が問題であるようです。
Arvind Krmar

1
私はそれを解決することができます。ファイアウォールはアクセスをブロックしていました。これは次のコードで
Arvind Krmar

回答:


25

mongodb atlasの管理パネルに移動します。セキュリティタブ>ネットワークアクセス> IPをホワイトリストに追加して追加します

特定のメニューを見つけるには、この画像を参照してください

注:GoogleでIPを確認して追加してください


2
やりましたが運はありませんでした。むしろ、私はすべてのIPを許可しましたが、それでも機能しませんでした
Arvind Krmar

仲間、DB設定を適切に設定しましたか
kunal usapkar

dbアクセス用のロールを作成しました:ユーザー名:arvind認証方法:SCRAM MongoDBRoles:atlasAdmin @ adminクラスターまたは「データレイク」に何かを作成する必要がありますか?
Arvind Krmar

それを解決することができ、すべてが正しかったが、ファイアウォールが27017同じポートへのアクセスをブロックしたが、ここでテストすることができます:portquiz.net:27017
アービンドKrmar


6

ユーザーとパスワードのフィールドを置き換えるときは、「<」と「>」が削除されていることを確認してください。これは私のために働いた


3

このエラーは、データベースへのアクセスを許可されたIPアドレスが原因で発生する場合があります。

あなたのアプリケーションはうまく機能しているかもしれませんし、そのようなエラーを思い付くかもしれません。これが発生すると、ほとんどの場合、IPアドレスが変更されますが、これは許可されたアドレスのホワイトリストに含まれていません。

あなたがしなければならないすべてはあなたの現在のIPアドレスでホワイトリストを更新することです


2

接続IPアドレスをホワイトリストに登録します。 Atlasは、プロジェクトのホワイトリストのエントリからクラスターへのクライアント接続のみを許可します。プロジェクトのホワイトリストは、特定のIPまたはCIDRアドレスへのAPIアクセスを制限するAPIホワイトリストとは異なります。

注意

クラスタのホワイトリストエントリがすでに構成されていることをAtlasがSetup Connection Securityステップで示している場合は、このステップをスキップできます。IPホワイトリストを管理するには、ホワイトリストへのエントリの追加を参照してください。

ホワイトリストが空の場合、AtlasはプロジェクトのホワイトリストにIPアドレスを追加するように求めます。次のいずれかを行うことができます。

[現在のIPアドレスを追加]をクリックして、現在のIPアドレスをホワイトリストに登録します。

[別のIPアドレスを追加]をクリックして、単一のIPアドレスまたはCIDR表記のアドレス範囲を追加します。

アマゾンウェブサービス(AWS)にデプロイされ、VPCピアリングを使用するAtlasクラスターの場合、ピアVPCに関連付けられたセキュリティグループを追加できます。

新しく追加されたIPアドレスまたはCIDR範囲のオプションの説明を提供できます。[IPアドレスの追加]をクリックして、アドレスをホワイトリストに追加します。


1

あなたはできる削除 {useUnifiedTopologyを:真}フラグと再インストールマングースdependecy!それは私のために働いた。


{useUnifiedTopology:true}を削除すると、次のエラーが発生します:(node:10020)DeprecationWarning:現在のサーバー検出および監視エンジンは非推奨であり、将来のバージョンで削除される予定です。新しいサーバー検出および監視エンジンを使用するには、オプション{useUnifiedTopology:true}をMongoClientコンストラクターに渡します。
Arvind Krmar

1

同じエラーが発生しました。これらは私がそれを解決するために従った手順です

  1. [セキュリティ]タブに移動します->ネットワークアクセス->次にIPをホワイトリストに登録します
  2. 次に、セキュリティタブ->データベースアクセス->に移動し、現在のユーザーを削除します。
  3. 新しいユーザー名とパスワードを入力して、新しいユーザーを作成します。
  4. で、その新しく作成されたユーザ名とパスワードを入力します.envのファイルまたはmongoose.connectの方法

これらのステップの後、それは通常通り機能しました。これが皆さんのお役に立てば幸いです。


0

あなたが試すことができます:

// Import express
let express = require('express');
// Import Body parser
let bodyParser = require('body-parser');
// Import Mongoose
let mongoose = require('mongoose');
// Initialize the app
let app = express();

// Import routes
let apiRoutes = require("./api-routes");
// Configure bodyparser to handle post requests
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

// Connect to Mongoose and set connection variable
mongoose.connect('mongodb://XXXX:XXXX@cluster0-shard-00-00-ov74c.mongodb.net:27017,cluster0-shard-00-01-ov74c.mongodb.net:27017,cluster0-shard-00-02-ov74c.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true&w=majority', {useNewUrlParser: true})
    .then(()=>console.log("DB server connect"))
    .catch(e => console.log("DB error", e));


var db = mongoose.connection;

// Added check for DB connection

if(!db)
    console.log("Error connecting db")
else
    console.log("Db connected successfully")

// Setup server port
var port = process.env.PORT || 8080;

// Send message for default URL
app.get('/', (req, res) => res.send('Hello World with Express'));

// Use Api routes in the App
app.use('/api', apiRoutes);
// Launch app to listen to specified port
app.listen(port, function () {
    console.log("Running RestHub on port " + port);
});

@ArvindKrmarあなたがウェブサイトmongoにログインしているなら?バージョンnode 3.00 or laterを選択してコピーしました `` mongodb + srv:// user:<password> @ cluster0-3zrv8.mongodb.net / test?RetryWrites = true&w =過半数 ''?3つのオプションから選択できます。中央のノードを選択します
Umbro

「アプリケーションの接続」ノードを選択し、上記の接続文字列をコピーしてパスワードを置き換えましたが、パスワードがどうあるべきか、atlast MongoDBにログインしたときのパスワードなどがわかりません。私が見つけようとしています
Arvind Krmar

@ArvindKrmarは、別のデータベースパスワードを提供しました
Umbro

「データベースアクセス」セクションで2人のユーザーを作成し、mongoDBへのログインに使用したのと同じパスワードを使用して、安全のため、またはアプリケーションの実行を開始しましたが、今のところうまくいきません。
Arvind Krmar

1
localhost "mongodb://127.0.0.1/FullStack"を使用すると、コードが機能します。したがって、Atlas MongoDBへの接続にはいくつかの問題があります。
Arvind Krmar

0

私はこの問題を抱えていました、私の解決策は私のIPが正しく構成されているかどうかを確認してからこの画面で確認すること

ここに画像の説明を入力してください


1
私は解決策を見つけました。問題はネットワークシステムのファイアウォール設定にありました。 portquiz.net:27017を使用して、接続が通過しているかどうかをテストできます。ファイアウォールは私のネットワーク管理者が管理しているため、ファイアウォールは変更しませんでしたが、ファイアウォールが動作するように修正されました。提案をありがとうございました。
Arvind Krmar

0

パスワード、ユーザー名、またはIP設定を確認してください。ほとんどの場合、「Timeout._onTimeoutで30000ミリ秒後にサーバー選択がタイムアウトしました」は、上記のものがサーバー構成と一致しない場合に必ず発生します。


それは私の最後のファイアウォールの問題でした。私はそれを修正し、現在は機能しています
Arvind Krmar

0

私は問題を解決することができます。すべては問題ありませんでしたが、ファイアウォールはポート27017へのアクセスをブロックしていました。接続はhttp://portquiz.net:27017/でテストするか、クラスターから取得できるエンドポイントへのtelnetを使用してテストできます->メトリック。

提案をありがとう、みんな


0

「SCRAM」であるデフォルトの認証方法を使用して、データベースアクセスで新しいユーザーを作成してみてください。次に、そのための新しいクラスターを作成します。それは私のために働いた!私の server.jsファイル

const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');

require('dotenv').config();

const app = express();
const port = process.env.PORT || 5000;

app.use(cors());
app.use(express.json());

//const uri = process.env.ATLAS_URI;
mongoose.createConnection("mongodb+srv://u1:u1@cluster0-u3zl8.mongodb.net/test", { userNewParser: true, useCreateIndex: true,  useUnifiedTopology: true}
    );

const connection = mongoose.connection;
connection.once('once', () => {
    console.log(`MongoDB databse connection established successfully`);
})

app.listen(port, () => {
    console.log(`Server is running on port: ${port}`);
});

0

あなたのマングースバージョンは何ですか?特定のマングースバージョンに問題があるためです。詳細については、このリンクにアクセスしてください " https://github.com/Automattic/mongoose/issues/8180 "。とにかく、私は同じ問題に直面していましたが、古いバージョン(5.5.2)を使用した後、それは私にとってはうまくいきました。試してみて何があったのか教えてください。


私は同じ問題に遭遇していましたが、頻繁にVPNのオンとオフを切り替えて開発しました。VPNを再びオンにすることで、なんとかDBに接続できました。VPNを常にオンにしておくことができないため、この問題が一時的なものであることを願っています。
Mike K

0

それは基本的にnpmの更新が原因である可能性があります。npm v 6.13.7にアップデートしました。そして私はそのエラーを受け始めました。

@Matheusからの指示に従って、「{useUnifiedTopology:true}」という行にコメントしましたが、それを通り抜けることができました。

マングースを更新したところ、すべて正常に動作しました。


0

ウイルス対策、ファイアウォール、VPN、または制限付きネットワーク(職場/商用Wi-Fi / LAN接続など)を使用していますか?次に、それをオフにするか、別のネットワークに再接続します。一部のIP /接続は、使用しているネットワークの管理者によってブロックされているか、単にウイルス対策にファイアウォールポリシーが設定されている可能性があります。でも、あなたが持っている場合しかし0.0.0.0、あなたの中IP AddressのMongoDBアトラスで。


0

同じ問題がありました。MongoDB CompassまたはNodeアプリから、At​​lasから提供された接続文字列を使用して接続できました。アトラスのホワイトリストに自分のIPアドレスを追加して解決しました。


0

まだこの問題に苦しんでいる人に。この問題は、mongooseオプション自体にユーザー名、パスワード、dbNameなどのすべてのパラメーターを設定することで解決しました。

以前のコードはこのようなものでした。(エラーが発生したとき)。

import mongoose from "mongoose";
mongoose.Promise = require("bluebird");

let dbName = process.env.DB_NAME;
const dbAddress = process.env.DB_HOST;
const dbPort = process.env.DB_PORT;
if(!dbName || !dbAddress || !dbPort){
    throw new Error("Mongo error unable to configuredatabase");
}

let options = {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    user:process.env.DB_USER,
    pass: process.env.DB_PASS
};

mongoose.connect(`mongodb://${dbAddress}:${dbPort}/${dbName}`, options).catch(err => {
    if (err.message.indexOf("ECONNREFUSED") !== -1) {
        console.error("Error: The server was not able to reach MongoDB. Maybe it's not running?");
        process.exit(1);
    } else {
        throw err;
    }
});

mongo connectのURLに注意してください。mongodb://${dbAddress}:${dbPort}/${dbName}

エラーのない新しいコード。

import mongoose from "mongoose";
mongoose.Promise = require("bluebird");

let dbName = process.env.DB_NAME;
const dbAddress = process.env.DB_HOST;
const dbPort = process.env.DB_PORT;
// console.log("process.env", process.env)
if(!dbName || !dbAddress || !dbPort){
    throw new Error("Mongo error unable to configuredatabase");
}

let options = {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    user:process.env.DB_USER,
    pass: process.env.DB_PASS,
    dbName: dbName
};

mongoose.connect(`mongodb://${dbAddress}:${dbPort}`, options).catch(err => {
    if (err.message.indexOf("ECONNREFUSED") !== -1) {
        console.error("Error: The server was not able to reach MongoDB. Maybe it's not running?");
        process.exit(1);
    } else {
        throw err;
    }
});

オプションとURLに注意してください。

これは私のローカル環境です。本番環境ではありません。

参考になれば幸いです。


0

クラスターでノードドライバーのバージョン2,2,12を指定してみてください->接続->アプリケーションに接続します。新しい文字列はmongodb://である必要があります。この文字列を使用して接続します。パスワードを入力することを忘れないでください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.