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
相关产品推荐
相关产品推荐

