MeWrite Docs

MongoDB: connect ECONNREFUSED

MongoDBへの接続が拒否された場合のエラー

概要

MongoDBサーバーへの接続が拒否された場合に発生するエラーです。サーバーが起動していない、接続文字列の誤り、認証の問題などが原因です。

エラーメッセージ

MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017
MongooseServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017
Error: connect ECONNREFUSED 127.0.0.1:27017
MongoServerSelectionError: connection timed out

原因

  1. MongoDBが起動していない: サーバープロセスが停止
  2. 接続文字列の誤り: URI形式が間違っている
  3. 認証エラー: ユーザー名/パスワードが不正
  4. ネットワーク問題: ファイアウォール、VPC設定
  5. IP許可リスト: MongoDB Atlasでのホワイトリスト未設定
  6. ポート不一致: デフォルト27017以外を使用

解決策

1. MongoDBの起動確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# サービスの状態確認
sudo systemctl status mongod

# MongoDBを起動
sudo systemctl start mongod

# Mac (Homebrew)
brew services start mongodb-community

# 直接起動
mongod --dbpath /data/db

2. 接続の確認

1
2
3
4
5
6
7
8
# mongo shellで接続テスト
mongosh

# ホストとポートを指定
mongosh --host localhost --port 27017

# 認証付き
mongosh "mongodb://user:password@localhost:27017/dbname"

3. 正しい接続文字列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 基本的な接続
const uri = 'mongodb://localhost:27017/mydb';

// 認証付き
const uri = 'mongodb://username:password@localhost:27017/mydb';

// MongoDB Atlas
const uri = 'mongodb+srv://username:password@cluster0.xxxxx.mongodb.net/mydb?retryWrites=true&w=majority';

// レプリカセット
const uri = 'mongodb://host1:27017,host2:27017,host3:27017/mydb?replicaSet=myReplicaSet';

4. Mongoose での接続

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
const mongoose = require('mongoose');

const uri = 'mongodb://localhost:27017/mydb';

mongoose.connect(uri, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  serverSelectionTimeoutMS: 5000,
  socketTimeoutMS: 45000,
})
.then(() => console.log('MongoDB connected'))
.catch(err => console.error('Connection error:', err));

// イベントハンドリング
mongoose.connection.on('error', (err) => {
  console.error('MongoDB error:', err);
});

mongoose.connection.on('disconnected', () => {
  console.log('MongoDB disconnected');
});

5. Node.js ドライバーでの接続

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
const { MongoClient } = require('mongodb');

const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri, {
  serverSelectionTimeoutMS: 5000,
  connectTimeoutMS: 10000,
});

async function connect() {
  try {
    await client.connect();
    console.log('Connected to MongoDB');
    const db = client.db('mydb');
    return db;
  } catch (error) {
    console.error('Connection failed:', error);
    throw error;
  }
}

6. MongoDB Atlas の設定

1
2
3
4
5
6
// Atlas 接続文字列
const uri = 'mongodb+srv://<username>:<password>@cluster0.xxxxx.mongodb.net/<dbname>?retryWrites=true&w=majority';

// IP許可リストの設定が必要
// Atlas Console > Network Access > Add IP Address
// 開発時: 0.0.0.0/0 (すべて許可、本番では非推奨)

7. Docker での接続

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# docker-compose.yml
version: '3.8'
services:
  mongodb:
    image: mongo:6
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: password
    volumes:
      - mongodb-data:/data/db

  app:
    build: .
    depends_on:
      - mongodb
    environment:
      - MONGODB_URI=mongodb://root:password@mongodb:27017/mydb?authSource=admin

volumes:
  mongodb-data:

8. 認証の設定

1
2
3
4
5
6
7
8
9
// 認証データベースを指定
const uri = 'mongodb://username:password@localhost:27017/mydb?authSource=admin';

// Mongoose
mongoose.connect(uri, {
  authSource: 'admin',
  user: 'username',
  pass: 'password',
});

9. mongod.conf の設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# /etc/mongod.conf

# ネットワーク設定
net:
  port: 27017
  bindIp: 127.0.0.1  # または 0.0.0.0 で外部接続許可

# セキュリティ(認証有効化)
security:
  authorization: enabled

10. 接続リトライの実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
const mongoose = require('mongoose');

const connectWithRetry = async (maxRetries = 5) => {
  for (let i = 0; i < maxRetries; i++) {
    try {
      await mongoose.connect(process.env.MONGODB_URI);
      console.log('MongoDB connected');
      return;
    } catch (err) {
      console.log(`Attempt ${i + 1} failed. Retrying in 5 seconds...`);
      await new Promise(resolve => setTimeout(resolve, 5000));
    }
  }
  throw new Error('Failed to connect to MongoDB');
};

connectWithRetry();

11. トラブルシューティング

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# MongoDBのログを確認
tail -f /var/log/mongodb/mongod.log

# ポートが開いているか確認
netstat -tlnp | grep 27017

# 接続テスト
nc -zv localhost 27017

# DNS解決の確認(Atlas)
nslookup cluster0.xxxxx.mongodb.net

12. ファイアウォールの設定

1
2
3
4
5
6
# Ubuntu/Debian
sudo ufw allow 27017/tcp

# CentOS/RHEL
sudo firewall-cmd --permanent --add-port=27017/tcp
sudo firewall-cmd --reload

接続チェックリスト

項目確認方法
プロセス起動pgrep mongod
ポート待受`netstat -tlnp
接続テストmongosh --eval "db.adminCommand('ping')"
認証接続文字列にユーザー/パスワードを含める
Atlas IP許可Network Access で IP を追加

よくある間違い

  • MongoDB Atlas で IP 許可リストを設定し忘れる
  • Docker 内から localhost で接続しようとする
  • パスワードに特殊文字があり URL エンコードしていない
  • authSource を指定し忘れる

関連エラー

参考リンク

MongoDB の他のエラー

最終更新: 2025-12-13