discord.js发送图片缓冲区附件失败 REQ_RESOURCE_TYPE报错排查
问题原因
你的判断完全正确,核心故障是异步逻辑处理错误,同时存在Buffer转换错误、函数返回值缺失两个附加问题:
getImage函数没有对外返回有效结果:你在waApi.getSimple().then()回调内部返回的Buffer,只会作为Promise的内部resolve值,不会成为getImage函数的返回值;同步调用getImage()时拿到的永远是undefined,传给附件构造函数自然触发「资源类型不合法」的报错。- Buffer转换逻辑错误:
waApi.getSimple()返回的是标准base64编码的图片data URL,第一次调用Buffer.from时未指定base64编码,拿到的是base64字符串本身的文本字节,而非图片解码后的二进制数据;后续反复做Buffer→base64字符串→Buffer的转换完全冗余,就算异步逻辑正常,生成的图片也会损坏。 - 未等待异步请求完成:Wolfram Alpha API请求是网络IO操作,发起请求后立刻执行构造附件、发消息的逻辑时,API还没返回结果,自然拿不到有效的图片数据。
修复方案
- 改造
getImage函数,直接返回API请求的Promise对象,去掉冗余转换逻辑,正确将data URL中的base64数据解码为图片二进制Buffer。 - 将
execute方法改为异步函数,使用await等待API请求完成、拿到有效Buffer后,再构造附件发送消息。 - 增加基础的参数校验、异常捕获逻辑,避免空查询、API请求失败导致机器人崩溃。
修复后完整代码
/** * @type {import('../../typings').LegacyCommand} */ const { MessageAttachment } = require("discord.js"); const WolframAlphaAPI = require('wolfram-alpha-api'); const waApi = WolframAlphaAPI('替换为你的Wolfram Alpha API Key'); // 异步获取查询结果图片Buffer async function getImage(question) { const dataUrl = await waApi.getSimple(question); // 提取data URL中的base64部分,直接解码为图片二进制Buffer const base64Image = dataUrl.split(",")[1]; return Buffer.from(base64Image, 'base64'); } module.exports = { name: "ask", async execute(message, args) { // 拼接用户查询内容 const question = args.join(" ").trim(); if (!question) { return message.reply("请输入你要查询的数学问题"); } try { // 等待API返回结果 const imageBuffer = await getImage(question); const resultAttachment = new MessageAttachment(imageBuffer, "query-result.png"); // 发送结果 await message.channel.send({ content: "查询结果如下:", files: [resultAttachment] }); } catch (err) { console.error("Wolfram Alpha查询失败:", err); message.reply("查询失败,请稍后重试或检查问题表述是否准确"); } }, };
注意事项
- 不要将Wolfram Alpha API Key提交到公开代码仓库,避免被滥用产生额外费用。
- 如果需要调整返回图片的尺寸、样式,可以在调用
waApi.getSimple时传入第二个参数配置,具体参数参考Wolfram Alpha Simple API官方说明。
内容的提问来源于stack exchange,提问作者Sayfullah Jumoorty
相关产品推荐
相关产品推荐

