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

Node.js使用Token请求Github私有库raw文件返回404,curl测试正常如何解决?

问题根因

核心问题是你的Node.js请求缺失User-Agent头,其次存在逻辑缺陷和重定向处理缺失:

  • Github服务端强制要求所有HTTP请求必须携带User-Agent标识,curl命令默认会自动生成并携带该头,而Node.js原生https.request不会默认添加该字段,因此Github会直接返回404响应。
  • 私有仓库的raw地址访问时可能先返回302临时重定向到资源实际存储地址,你的代码仅将200状态码判定为成功,其余状态码直接抛出,即使重定向地址可正常访问也会报错。
  • catch块存在语法错误:if (err = 404)是赋值操作,不是相等判断,会导致所有错误都命中该分支。

修复后的代码

const https = require('https');

let requestUrl = 'https://raw.githubusercontent.com/account/repo/branch/filename.json';
const options = {
  headers: {
    'Authorization': 'token ghp_personal-access-token',
    // 必须添加User-Agent头,可自定义内容
    'User-Agent': 'My-Github-Reader'
  }
};

// 支持重定向的请求方法
function promiseHttpsRequest(requestUrl, options, redirectCount = 0) {
  return new Promise((resolve, reject) => {
    // 最多跟随5次重定向,避免死循环
    if (redirectCount > 5) return reject(new Error('Too many redirects'));
    
    const req = https.request(requestUrl, options, res => {
      // 处理301/302重定向
      if ([301, 302].includes(res.statusCode) && res.headers.location) {
        return resolve(promiseHttpsRequest(res.headers.location, options, redirectCount + 1));
      }
      
      let body = '';
      res.on('data', chunk => body += chunk);
      res.on('end', () => {
        if (res.statusCode === 200) return resolve(body);
        reject(res.statusCode);
      });
    });
    
    req.on('error', reject);
    req.end();
  });
}

// 调用逻辑
(async () => {
  try {
    const body = await promiseHttpsRequest(requestUrl, options);
    const remoteFile = JSON.parse(body);
  } catch (err) {
    // 修正相等判断
    if (err === 404) throw new Error('This repository requires a token or does not exist. \n ' + requestUrl);
    throw err;
  }
})();

内容的提问来源于stack exchange,提问作者Elliot Starks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:54:03