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
相关产品推荐
相关产品推荐

