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

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还没返回结果,自然拿不到有效的图片数据。
修复方案
  1. 改造getImage函数,直接返回API请求的Promise对象,去掉冗余转换逻辑,正确将data URL中的base64数据解码为图片二进制Buffer。
  2. 将execute方法改为异步函数,使用await等待API请求完成、拿到有效Buffer后,再构造附件发送消息。
  3. 增加基础的参数校验、异常捕获逻辑,避免空查询、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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:39:23