发起GET请求读取在线文件时遭遇ECONNREFUSED连接拒绝错误求助
看起来你在请求MTGJSON的版本文件时遇到了连接拒绝的问题,我来帮你一步步排查和修复:
首先分析错误原因
你看到的events.js:160 throw er; // Unhandled 'error' event和Error: connect ECONNREFUSED 127.0.0.1:443,说明Node.js居然在尝试连接本地的443端口,而不是目标的mtgjson服务器。这大概率是URL定义的语法错误,再加上代码缺少错误处理、请求头配置,还有版本解析的逻辑问题,共同导致了这些报错。
具体修复步骤
1. 修正URL的语法错误
你的代码里var url = https://mtgjson.com/json/version.json没有用引号包裹URL字符串,这会让Node.js无法正确识别这是一个远程地址,进而出现错误的请求目标。必须把URL放在单引号或双引号里:
var url = 'https://mtgjson.com/json/version.json';
2. 添加符合要求的请求头
目标服务器可能会拒绝缺少必要请求头的请求,比如很多服务器会要求有User-Agent字段。结合你提供的请求头信息,我们可以在HTTPS请求时配置完整的请求头:
const options = { hostname: 'mtgjson.com', path: '/json/version.json', headers: { 'Accept': 'application/json', // 明确请求JSON格式,比通用的更精准 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3', 'User-Agent': 'Node.js MTGJSON Updater' // 必须添加,避免被服务器拦截 } };
3. 必须监听请求的错误事件
你的代码没有处理请求失败的情况,一旦连接出问题就会抛出未处理的异常。一定要添加error事件的监听:
https.get(options, function(res) { // 响应处理逻辑 }).on('error', function(err) { console.error('请求出错啦:', err.message); // 这里可以添加错误后的回调或降级处理 });
4. 正确解析版本号
你用jsonObject.toString()会得到[object Object],这根本不是版本号。MTGJSON的version.json里应该有明确的版本字段(比如version),所以要提取对应的属性:
const version = jsonObject.version;
5. 注意拼接完整的响应数据
data事件可能会多次触发(比如数据分块传输),直接在data事件里解析JSON会得到不完整的内容,导致解析错误。需要先拼接所有数据块,再在end事件里解析:
let rawData = ''; res.on('data', function(chunk) { rawData += chunk; }); res.on('end', function() { try { const jsonObject = JSON.parse(rawData); // 后续版本判断逻辑 } catch (e) { console.error('JSON解析出错:', e.message); } });
完整的修正代码
const https = require('https'); // 假设这是你之前保存的本地版本号 let currentVersion = '5.10.0'; function update() { console.log('开始执行更新逻辑...'); // 这里写你的文件更新代码 } function callback() { console.log('无需更新,继续执行后续操作...'); } const options = { hostname: 'mtgjson.com', path: '/json/version.json', headers: { 'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3', 'User-Agent': 'Node.js MTGJSON Updater' } }; https.get(options, function(res) { res.setEncoding('utf8'); let rawData = ''; res.on('data', function(chunk) { rawData += chunk; }); res.on('end', function() { try { const jsonObject = JSON.parse(rawData); const remoteVersion = jsonObject.version; console.log('远程版本:', remoteVersion); console.log('本地版本:', currentVersion); if (remoteVersion !== currentVersion) { console.log('发现新版本!开始更新...'); currentVersion = remoteVersion; update(); } else { console.log('当前已是最新版本,无需更新'); callback(); } } catch (e) { console.error('解析JSON失败:', e.message); } }); }).on('error', function(err) { console.error('请求MTGJSON服务器失败:', err.message); });
额外提示
如果服务器返回的是压缩数据(比如gzip格式),你可能需要用zlib模块来解压数据。不过大多数情况下,Node.js的HTTPS模块会自动处理,但如果遇到解压错误,可以手动添加解压逻辑。
内容的提问来源于stack exchange,提问作者Werner Germán Busch

