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

本地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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:17:39