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

Plesk部署Node.js API无法连接MongoDB Atlas问题求助

问题描述

我开发了一个连接MongoDB Atlas的Node.js API,已将MongoDB Network Access设置为0.0.0.0/0(允许所有IP访问),该API在本地及Render免费主机运行正常,但部署到Plesk付费主机后无法连接数据库。执行npm run start返回非零退出码1,报错MongooseServerSelectionError,提示IP未加入白名单——即使已将Plesk服务器IP添加至MongoDB Atlas的Network Access列表,问题依旧。

相关代码如下:

MongoDB连接代码

const mongoose = require("mongoose").set("strictQuery", false);
const connectDB = async () => {
  try {
    const conn = await mongoose.connect(process.env.MONGODB_URI);
    console.log(`MongoDB connected: 
        ${conn.connection.host}`.cyan.underline);
  } catch (error) {
    console.log(error);
    process.exit(1);
  }
};
module.exports = connectDB;

server.js 文件

require("colors");
require("dotenv").config();
const cors = require("cors");
const express = require("express");
const { errorHandler } = require("./middleware/errorMiddleware");
const connectDB = require("./config/db");
const port = process.env.PORT || 5000;

connectDB();
const app = express();
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

app.use("/api/auth", require("./routes/authRoutes"));
app.use("/api/quiz", require("./routes/quizRoutes"));
app.use("/api/users", require("./routes/userRoutes"));
app.use("/api/exams", require("./routes/examRoutes"));
app.use("/api/stats", require("./routes/statsRoutes"));
app.use("/api/courses", require("./routes/courseRoutes"));
app.use("/api/reviews", require("./routes/reviewRoutes"));
app.use("/api/questions", require("./routes/questionRoutes"));

app.use(errorHandler);

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

错误处理中间件

const errorHandler = (err, req, res, next) => {
  const statusCode = res.statusCode ? res.statusCode : 500;
  res.status(statusCode);
  res.json({
    message: err.message,
    stak: process.env.NODE_ENV === "production" ? null : err.stack,
  });
};

module.exports = { errorHandler };
排查与解决步骤
  • 确认Plesk真实出站IP:部分Plesk主机使用NAT网络,服务器内部IP和出站公网IP不一致。在Plesk服务器执行curl ifconfig.me或curl ipinfo.io/ip获取真实公网IP,将其添加到MongoDB Atlas白名单。
  • 验证环境变量正确性:检查Plesk环境中MONGODB_URI配置是否完整,确认用户名、密码、集群地址、数据库名无拼写错误。可临时在代码中打印变量值(注意生产环境隐藏敏感信息)。
  • 测试网络连通性:在Plesk服务器执行telnet <mongodb-cluster-host> 27017或nc -zv <mongodb-cluster-host> 27017,确认能否连通MongoDB端口。若失败,需联系主机服务商开放27017端口(或Atlas实际使用的端口)。
  • 优化Mongoose连接参数:给mongoose.connect添加超时、重试选项,应对网络波动:
await mongoose.connect(process.env.MONGODB_URI, {
  connectTimeoutMS: 30000,
  socketTimeoutMS: 45000,
  retryWrites: true,
  w: 'majority'
});
  • 检查Node.js版本兼容性:确保Plesk上的Node.js版本和本地、Render一致,避免版本差异导致连接异常。通过node -v查看版本,优先使用MongoDB官方支持的版本。
  • 查看Atlas连接日志:登录MongoDB Atlas控制台,进入集群「Network Access」页面,查看连接尝试日志,确认是否有Plesk IP的请求被拒绝,或存在其他报错信息。

内容的提问来源于stack exchange,提问作者Noomen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 13:46:11