Discord.js注册斜杠命令时遇「Expected a string primitive」错误求助
问题分析与修复方案
核心错误原因
你遇到的「Expected a string primitive Received: | undefined」错误,主要由以下代码问题导致:
1. 对象属性语法错误
导出的对象中,data属性定义后缺少逗号分隔符,导致JavaScript解析时无法识别后续的do方法,模块导出结构异常,命令加载器无法读取正确的命令属性。
2. SlashCommandBuilder构建不完整
data赋值语句未正确结束,且缺少命令描述(discord.js v14要求所有斜杠命令必须设置描述),导致命令注册时缺少必填的字符串属性。
3. Embed颜色参数错误
setColor([40,40,38,255])使用了RGBA四元数组,但discord.js的EmbedBuilder仅支持RGB三元数组或十六进制颜色字符串,RGBA值会被解析错误。
修复后的完整代码
const { SlashCommandBuilder, EmbedBuilder, Client, CommandInteraction, CommandInteractionOptionResolver } = require("discord.js"); module.exports = { name: "ping", data: new SlashCommandBuilder() .setName("ping") .setDescription("查看机器人与API的延迟"), // 必须添加命令描述 async do(client, interaction, options) { const check = await interaction.reply({ content: "Pinging...", fetchReply: true }); const latency = check.createdTimestamp - interaction.createdTimestamp; const pingEmbed = new EmbedBuilder() .setTitle(":ping_pong: Pong!") .setColor([40, 40, 38]) // 修改为RGB三元数组 .setTimestamp() .addFields( { name: "Bot Latency", value: `${latency}ms`, inline: true }, { name: "API Latency", value: `${client.ws.ping}ms`, inline: true } ); await interaction.editReply({ content: "", embeds: [pingEmbed] }); } };
额外验证点
- 确认命令加载器正确遍历
commands文件夹,读取每个模块的name和data属性,将data.toJSON()作为命令注册的payload发送到Discord API。 - 检查加载器是否依赖
name属性,若模块因语法错误导致name未被正确读取,也会触发该错误。
内容的提问来源于stack exchange,提问作者sanders
相关产品推荐
相关产品推荐

