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

在Cyclic.sh部署Node.js动态网站遭遇503错误求助

部署Node.js动态网站到Cyclic.sh时持续触发503错误

本地运行完全正常,使用MongoDB Atlas作为数据库,部署到Cyclic.sh后持续收到503错误,已配置MONGODB_URL环境变量指向MongoDB Atlas实例,相关信息如下:

相关代码

app.js

const path = require("path");
const express = require("express");
const csrf = require("csurf");
const expressSession = require("express-session");

const authRoutes = require("./routes/auth.routes");
const db = require("./database/database");
const addCsrfTokenMiddleware = require("./middlewares/csrf-tokens");
const errorHandlerMiddleware = require("./middlewares/error-handler");
const createSessionConfig = require("./config/session");
const productsRoutes = require("./routes/products.routes");
const baseRoutes = require("./routes/base.routes");
const checkAuthStatusMiddleware = require("./middlewares/check-auth");
const adminRoutes = require("./routes/admin.routes");
const protectRoutes = require("./middlewares/protect-routes");
const cartMiddleware = require("./middlewares/cart");
const cartRoutes = require("./routes/cart.routes");
const ordersRoutes = require("./routes/orders.routes");
const updateCartPrices = require("./middlewares/update-cart-prices");
const notFoundMiddleware = require("./middlewares/not-found");
const app = express();

const sessionConfig = createSessionConfig();

app.set("view engine", "ejs"); //set view engine as ejs
app.set("views", path.join(__dirname, "views")); //make contents of view folder available public. Now they can be accessed in rotuers->controllers

app.use(express.static("public")); //make public folder accessible
app.use("/products/assets", express.static("product-data"));
app.use(express.urlencoded({ extended: false })); //send data from ejs-forms to backend
app.use(express.json()); // for sending json data to backend, fetch in cart

app.use(expressSession(sessionConfig)); //  created session after csrf and csrf is dependent on session
app.use(csrf());
app.use(cartMiddleware); //creating the cart
app.use(updateCartPrices);
app.use(addCsrfTokenMiddleware);
app.use(checkAuthStatusMiddleware);
app.use(baseRoutes);
app.use(authRoutes);
app.use(productsRoutes);
app.use("/cart", cartRoutes);
// app.use(protectRoutes);
app.use("/orders", protectRoutes, ordersRoutes); //only to auth users
app.use("/admin", protectRoutes, adminRoutes);
app.use(notFoundMiddleware);
app.use(errorHandlerMiddleware); //makes the task easy for error indentification

db.connectToDatabase()
  .then(() => {
    app.listen(3000);
  })
  .catch(function (error) {
    console.log("Failed to connect to database!");
    console.log(error);
  });

database.js

const mongodb = require("mongodb");

const MongoClient = mongodb.MongoClient;
let mongodbUrl = "mongodb://localhost:27017"; //default database server

if (process.env.MONGODB_URL) {
   // MONGODB_URL: 指向数据库所在服务器,不存在则使用默认值
   mongodbUrl = process.env.MONGODB_URL;
 }


let database;

async function connectToDatabase() {
  const client = await MongoClient.connect(mongodbUrl);
  database = client.db("online-shop");
}

function getDb() {
  if (!database) {
    throw new Error("Database not connected");
  }
  return database;
}

module.exports = {
  connectToDatabase: connectToDatabase,
  getDb: getDb,
};

环境变量配置

已配置的MONGODB_URL环境变量:

MONGODB_URL=mongodb+srv://user_name:my_password@cluster0.lfsfoxew.mongodb.net/?retryWrites=true&w=majority

(注:user_name为实际数据库用户名,my_password为对应密码)

错误提示

浏览器控制台返回:

Failed to load resource: the server responded with a status of 503 ()

排查与解决方案

1. 修正端口监听配置

Cyclic.sh会为应用分配动态端口,不能硬编码为3000。修改app.js中的监听代码:

db.connectToDatabase()
  .then(() => {
    const port = process.env.PORT || 3000; // 优先使用平台分配的PORT环境变量
    app.listen(port, () => {
      console.log(`Server running on port ${port}`);
    });
  })
  .catch(function (error) {
    console.log("Failed to connect to database!");
    console.log(error);
  });

2. 检查MongoDB Atlas IP白名单

确保Atlas允许Cyclic.sh的服务器访问:

  • 登录MongoDB Atlas控制台,进入目标集群的Network Access
  • 添加0.0.0.0/0(临时允许所有IP,测试通过后可替换为Cyclic.sh官方IP段)
  • 保存配置后重新部署应用

3. 验证数据库连接字符串

  • 确认用户名、密码无未编码的特殊字符(如@、#等需用URL编码)
  • 建议在连接字符串末尾直接指定数据库名,避免潜在的数据库选择问题:
    MONGODB_URL=mongodb+srv://user_name:my_password@cluster0.lfsfoxew.mongodb.net/online-shop?retryWrites=true&w=majority
    

4. 确认Cyclic.sh环境变量生效

  • 登录Cyclic.sh控制台,进入应用的Environment Variables页面
  • 检查MONGODB_URL是否配置正确,无拼写错误
  • 重新部署应用,确保环境变量生效

5. 查看Cyclic.sh应用日志

通过Cyclic.sh控制台的Logs页面查看详细错误信息:

  • 若数据库连接失败,日志会输出具体错误(如认证失败、连接超时)
  • 若端口绑定失败,日志会提示端口占用或权限问题

6. 优化Session配置(生产环境)

当前代码使用默认的内存Session存储,生产环境易导致内存泄漏或Session丢失。建议替换为Cyclic.sh支持的持久化Session存储(如Redis),避免服务异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:20:08