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

Express.js用户API本地正常,部署Cyclic/Vercel后无法访问求助

Express.js API部署Cyclic后SSL/连接问题排查方案

问题概述

本地通过ThunderClient测试POST http://localhost:8080/api/user/register请求完全正常,测试JSON数据如下:

{"FIRST_NAME": "John", "LAST_NAME": "Doe", "USER_NAME": "rmon", "USER_PASS": "password123?", "USER_PASS2": "password123?", "EMAIL_ADDRESS": "rmon@example.com", "DATE_CREATED": "2022-01-01", "IS_ACTIVE": true, "TERMS": true}

部署至Cyclic平台后,通过HTTPS域名(如https://link.cyclic.app/api/user/register)测试时返回SSL错误:

write EPROTO 22793600:error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER:....\third_party\boringssl\src\ssl\tls_record.cc:231:

切换为HTTP请求则收到「连接被服务器拒绝」响应。Cyclic日志显示API监听端口3000,无服务启动报错。


排查与解决方向

1. 环境变量配置验证

  • Cyclic不会自动同步本地.env文件,需手动在平台的「环境变量」设置页添加JWT_SECRET和MONGO_URL,确保变量名称、值与本地完全一致。
  • 检查MONGO_URL的有效性:确认包含正确的用户名、密码、集群地址,且MongoDB服务(如Atlas)的IP白名单已允许Cyclic服务器访问(测试阶段可临时添加0.0.0.0/0,生产环境需限制具体IP)。

2. SSL错误根源修复

WRONG_VERSION_NUMBER错误本质是协议不匹配:

  • 确保测试时使用Cyclic提供的完整HTTPS域名,禁止混用HTTP/HTTPS协议。
  • 代码中不要自行配置HTTPS相关逻辑,Cyclic会自动处理SSL终止,应用只需监听process.env.PORT即可(代码中const HTTP_PORT = process.env.PORT || 8080;已符合要求)。

3. 数据库连接逻辑优化

user-service.js中的MongoDB连接方式存在稳定性问题,可修改为:

module.exports.connect = () =>{
    return new Promise(function (resolve, reject){
        mongoose.connect(mongoDBConnectionString, {
            useNewUrlParser: true,
            useUnifiedTopology: true
        })
        .then(() => {
            console.log("Connected to Chronicle DB");
            User = mongoose.model("users", userSchema);
            resolve();
        })
        .catch(err => {
            console.error("MongoDB connection error:", err);
            reject(err);
        });
    });
};

同时检查Cyclic日志是否有Connected to Chronicle DB输出,若没有则说明数据库连接失败,需重新核对MONGO_URL。

4. CORS配置调整

本地测试CORS无问题,但部署后建议明确允许的域名范围:

// 替换原有的app.use(cors());
app.use(cors({
  origin: ['https://your-frontend-domain.com', 'https://link.cyclic.app'], // 替换为实际域名
  credentials: true
}));

测试阶段可临时设置origin: true,生产环境必须限制具体域名。

5. 登录接口字段名修正

user-service.js的checkUser方法存在字段名不匹配问题,会导致登录失败,需修正:

// 原错误代码
User.findOne({ userName: userData.userName })
bcrypt.compare(userData.password, user.password)

// 修正后
User.findOne({ USER_NAME: userData.USER_NAME })
bcrypt.compare(userData.USER_PASS, user.USER_PASS)

确保登录请求的JSON字段名与后端schema一致(如USER_NAME而非userName)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:44:59