使用discord.js调用AtomicAssets API时出现GET请求ENOTFOUND错误
解决Discord机器人调用AtomicAssets API时的ENOTFOUND错误
我帮你排查出了代码里的核心问题——http.request的配置参数写错了,这才导致了DNS解析失败的错误。具体问题和修复方案如下:
问题根源
你在options里的hostname字段填了完整的URL前缀加路径(http://test.wax.api.atomicassets.io/atomicassets),但这个字段只需要填写纯域名(比如test.wax.api.atomicassets.io),不能包含协议(http://)或路径部分。同时path字段也没写全,导致请求路径错误。
另外还有两个小问题需要优化:
- 每次收到消息都重复
require('http')会浪费性能,应该把模块引入放在文件顶部 - http模块接收数据是分块的,不能在
data事件里直接回复,需要收集完所有数据再处理
修正后的完整代码
// 把模块引入放在顶部,避免重复加载 const { token } = require('./token.json'); const Discord = require('discord.js'); const http = require('http'); // 如果API实际用HTTPS,换成require('https') const bot = new Discord.Client(); bot.login(token); bot.on('message', message => { if (message.content === 'assets') { const options = { hostname: 'test.wax.api.atomicassets.io', // 只保留纯域名,去掉协议和路径 path: '/atomicassets/v1/assets', // 完整的API请求路径 method: 'GET' }; const req = http.request(options, res => { console.log(`statusCode: ${res.statusCode}`); let rawData = ''; // 分块接收数据,拼接成完整内容 res.on('data', chunk => { rawData += chunk; }); // 数据接收完成后,处理并回复到Discord res.on('end', () => { try { const assetsData = JSON.parse(rawData); // 格式化JSON后发送,方便查看 message.reply(`获取到资产数据:\n\`\`\`json\n${JSON.stringify(assetsData, null, 2)}\n\`\`\``); } catch (parseErr) { message.reply(`解析数据出错:${parseErr.message}`); } }); }); req.on('error', error => { console.error(error); message.reply(`请求API失败:${error.message}`); }); req.end(); } });
关键修复点说明
- 修正hostname和path:拆分URL为纯域名和完整路径,让http模块能正确解析服务器地址,解决
ENOTFOUND错误 - 完整接收数据:通过
data事件拼接所有数据块,在end事件里处理完整内容,避免只发送部分数据 - 优化模块引入:把http模块的引入放在文件顶部,提升性能
- 增强错误反馈:添加JSON解析错误捕获,并把错误信息反馈给Discord用户,让机器人更友好
如果你的API实际使用HTTPS协议(比如Postman请求用的是https),只需要把const http = require('http')改成const https = require('https'),同时http.request换成https.request即可。
内容的提问来源于stack exchange,提问作者user13506524
相关产品推荐
相关产品推荐

