Express.js用户API本地正常,部署Cyclic/Vercel后无法访问求助
问题概述
本地通过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

