NodeJS代理API端点无响应问题排查(调用MailerLite API)
问题分析与修复方案
核心问题:未向前端返回响应
你在第三方API响应的end事件里仅执行return body.toString(),但这个返回值无法传递到Express的响应流程中,前端请求会一直处于等待状态直至超时。必须调用Express响应对象的send()/json()方法,将第三方API的结果主动返回给前端。
次要问题:变量名冲突与缺失错误处理
- 路由回调的参数
req被内部的http.request请求变量覆盖,可能引发潜在逻辑问题,建议重命名内部请求变量。 - 未处理第三方API请求失败的场景(如网络错误、API返回错误状态码),会导致前端请求无响应。
修复后的完整代码
const app = express(); const https = require("https"); app.get('/api/mailers/campaigns', (req, res) => { let chunks = []; const options = { method: "GET", hostname: "api.mailerlite.com", port: null, path: "/api/v2/campaigns", headers: { "x-mailerlite-apikey": "api_key", // 替换为你的真实API密钥 "content-type": "application/json" } }; // 重命名内部请求变量,避免覆盖Express的req对象 const mlReq = https.request(options, function (mlRes) { mlRes.on("data", function (chunk) { chunks.push(chunk); }); mlRes.on("end", function () { const body = Buffer.concat(chunks).toString(); // 将第三方API的响应返回给前端,同步状态码 res.setHeader('Content-Type', 'application/json'); res.status(mlRes.statusCode).send(body); }); }); // 添加错误处理,前端能收到明确的失败提示 mlReq.on('error', (err) => { res.status(500).json({ error: '请求MailerLite API失败', details: err.message }); }); mlReq.end(); });
额外说明
- 确保将代码中的
api_key替换为真实的MailerLite密钥,当前的代理模式能有效避免密钥暴露给前端,符合安全要求。 - 如果第三方API返回JSON格式,也可以用
res.json(JSON.parse(body))直接返回JSON对象,更贴合Express的响应规范。 - 若需要转发前端传来的参数(如分页、筛选条件),可拼接在
options.path中,实现完整的代理逻辑。
内容的提问来源于stack exchange,提问作者SuRaj Creator
相关产品推荐
相关产品推荐

