本地Gitea实例API请求超时:curl可行但Node.js脚本失败
排查思路与修复建议
以下是针对你的Node.js请求超时问题的核心排查点与修复方案:
1. 未手动结束请求(最直接的超时原因)
你的writeGitea函数中,调用request.write(JSON.stringify(body))后没有调用request.end()。Node.js的https.request需要手动结束请求,告知服务器请求体已发送完成,否则服务器会一直等待,最终导致连接超时断开。
修复:在request.write后添加结束语句:
request.write(JSON.stringify(body)); request.end(); // 新增:结束请求
2. 请求头拼写错误
全局options里的认证头写的是'Authorisation'(英式拼写),但标准HTTP认证头为**'Authorization'**(美式拼写)。虽然你在URL中携带了token参数,但头字段的错误可能干扰请求处理逻辑。
修复:将头字段名修正为标准拼写:
headers : { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization' : 'c9454acadb6b68c2897a9abfbef56d5ec3dfe433' // 修正拼写 }
3. 全局options对象复用的潜在冲突
你将options定义为全局变量,每次调用writeGitea都会修改同一个对象的path和method属性。即便当前用await串行调用,后续若改为并行请求,极易引发参数混乱。
修复:每次调用时创建独立的options对象:
async function writeGitea(url, method, body) { console.log('writeGitea to url',url, 'method', method, 'body', body) // 每次创建新的options,避免全局复用 const options = { hostname: 'gitea.local', port: 3443, path: `/api/v1/repos/alan/PAS/${url}?token=c9454acadb6b68c2897a9abfbef56d5ec3dfe433`, method: method, headers : { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization' : 'c9454acadb6b68c2897a9abfbef56d5ec3dfe433' } }; return new Promise((resolve,reject) => { const request = https.request(options, (res) => { // 原有响应处理逻辑 }); // 新增:监听request层面的错误,而非仅监听response的错误 request.on('error', (err) => reject(Error(`Gitea请求失败: ${err.message}`))); request.write(JSON.stringify(body)); request.end(); }); }
4. 响应体未解析为JSON
当前resolve(body)返回的是字符串,后续代码中labellist.set(label.id, l.id)会报错(l是字符串而非对象)。
修复:在响应结束时解析JSON:
res.on('end', () => { console.log('Gitea Request Complete, Status Code', res.statusCode, 'URL', options.path, 'response body', body) if (res.statusCode > 299) { reject(new Error(`请求失败,状态码${res.statusCode}: ${body}`)); } else { try { const data = JSON.parse(body); resolve(data); } catch (parseErr) { reject(new Error(`响应解析失败: ${parseErr.message}`)); } } });
额外排查点
- 验证DNS解析:确认
gitea.local能正确解析到NAS的IP,可直接替换为NAS的内网IP(如192.168.0.190)测试,排除Node.js与系统curl的DNS解析差异。 - 处理自签名证书:若Gitea使用自签名证书,Node.js默认会拒绝连接,可在options中临时添加
rejectUnauthorized: false(仅测试用,生产环境建议配置可信证书)。 - 打印完整错误信息:将
reject(res.statusCode)改为带响应体的错误提示,便于查看Gitea返回的具体错误原因。
内容的提问来源于stack exchange,提问作者akc42
相关产品推荐
相关产品推荐

