You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB Atlas连接问题:ETIMEDOUT超时错误求助

Express + Mongoose 连接 MongoDB Atlas 出现 ETIMEDOUT 错误的解决方案

问题描述

使用Express服务器通过Mongoose连接MongoDB Atlas时遭遇连接超时,错误信息如下:

const timeoutError = new error_1.MongoServerSelectionError(`Server selection timed out after ${serverSelectionTimeoutMS} ms`, this.description);
                                     ^

MongoServerSelectionError: connect ETIMEDOUT 13.37.173.41:27017

相关代码片段:

require('dotenv').config();
const mongoose = require('mongoose');
const uri = process.env.MONGODB_URI;

const connectDB = mongoose.createConnection(uri, {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

const UserSchema = require('../models/User');
const taskSchema = require('../models/Task');
const projectSchema = require('../models/Project');
const MessageSchema = require('../models/Message');

const User = connectDB.model('User', UserSchema);
const Task = connectDB.model('Task', taskSchema);
const Project = connectDB.model('Project', projectSchema);
const Message = connectDB.model('Message', MessageSchema);

module.exports = { connectDB, User, Task, Project, Message };

解决方案

  • 检查MongoDB Atlas IP白名单
    登录MongoDB Atlas控制台,进入目标集群的「Network Access」页面:

    • 确认已添加当前服务器/本地设备的公网IP;测试环境可临时设置为0.0.0.0/0(生产环境必须限制具体IP)
    • 本地开发若重启路由器,IP可能变更,需重新更新白名单
  • 验证连接字符串正确性

    • 确保.env文件中的MONGODB_URI是从Atlas控制台复制的官方连接字符串,已替换<password>为数据库用户的真实密码,<dbname>为目标数据库名
    • 若密码包含@、#等特殊字符,需进行URL编码(例如@编码为%40)
  • 优化Mongoose连接配置
    Mongoose 6.x及以上版本已默认启用useNewUrlParser和useUnifiedTopology,可移除这两个配置,并添加稳定性相关参数:

    const connectDB = mongoose.createConnection(uri, {
      serverSelectionTimeoutMS: 5000, // 缩短超时时间,快速定位问题
      socketTimeoutMS: 45000,
      autoReconnect: true,
      reconnectTries: Number.MAX_VALUE,
      reconnectInterval: 1000
    });
    
  • 排查网络连通性

    • 确认服务器/本地网络的防火墙、代理未拦截27017端口的出站请求
    • 用telnet 13.37.173.41 27017或nc -zv 13.37.173.41 27017测试端口连通性,若不通则为网络层面问题
  • 改用全局连接方法
    单数据库场景推荐使用mongoose.connect()替代createConnection(),确保连接状态管理正确:

    require('dotenv').config();
    const mongoose = require('mongoose');
    const uri = process.env.MONGODB_URI;
    
    async function connectDB() {
      try {
        await mongoose.connect(uri);
        console.log('MongoDB Atlas连接成功');
      } catch (err) {
        console.error('连接失败:', err);
        process.exit(1);
      }
    }
    
    connectDB();
    
    // 模型定义直接使用mongoose.model()
    const User = mongoose.model('User', require('../models/User'));
    const Task = mongoose.model('Task', require('../models/Task'));
    const Project = mongoose.model('Project', require('../models/Project'));
    const Message = mongoose.model('Message', require('../models/Message'));
    
    module.exports = { User, Task, Project, Message };
    

内容的提问来源于stack exchange,提问作者ibtissam ech-chaibi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:10:17