Discord.js使用MessageEmbed时报inspect().addField非函数错误的修复方法
报错根因
该报错完全由链式调用的括号匹配错位导致,和Discord.js API、Node.js内置inspect模块的功能逻辑无关。
逐行拆解原代码的语法解析流程:
- 原代码对应'Evaled'字段的第二个
.addField方法,在写完第二个参数(由inspect结果拼接的代码块字符串)后,未添加闭合右括号,直接衔接了第三个.addField(对应'Type Of'字段)的链式调用 - JS解析器会将后续的
.addField(...)调用,判定为对inspect返回值(字符串类型)发起addField方法调用。字符串不存在该原型方法,因此直接触发类型报错
修复方案
- 严格对齐链式调用的括号规则,每个
.addField方法调用完成后立即闭合括号,不得将整段链式调用的所有闭合括号堆在代码末尾。该修改可直接解决当前触发的类型报错 - 可选优化1:对eval执行结果的字符串长度做截断处理,避免超过Discord单字段最大1024字符的限制,导致嵌入消息发送失败
- 可选优化2:如果使用Discord.js v14+版本,原有
Discord.MessageEmbed构造方式依然兼容,无需强制切换到新的EmbedBuilder API
修正后可直接运行的代码
// 确保从util模块引入inspect const { inspect } = require('util'); // Discord单字段允许的最大字符数 const MAX_FIELD_LIMIT = 1024; var embed = new Discord.MessageEmbed() .setColor('#f03824') .setTitle('Evaluated') .addField('To Eval', `\`\`\`${command.slice(0, MAX_FIELD_LIMIT)}\`\`\``) .addField('Evaled', `\`\`\`js\n${inspect(evaled, { depth: 0 }).slice(0, MAX_FIELD_LIMIT)}\`\`\``) .addField('Type Of', `\`\`\`${typeof evaled}\`\`\``); message.channel.send(embed);
内容的提问来源于stack exchange,提问作者John Jain
相关产品推荐
相关产品推荐

