使用discord.js实现/warn命令时DM用户遇令牌错误求助
问题解决:Discord.js /warn命令发送DM时出现"Expected token to be set for this request"错误
错误原因
你在命令模块中重新创建了一个未登录的Client实例,Discord API请求需要已登录客户端的token验证,这个新实例没有配置有效token,因此触发该错误。命令模块无需单独初始化Client,应直接使用交互对象提供的已登录客户端实例。
修复步骤
- 删除冗余的Client初始化代码:移除命令文件中新建
Client的相关代码。 - 使用已登录客户端:通过
interaction.client获取bot主程序中已完成登录的Client实例。 - 优化DM发送逻辑:直接调用目标User对象的
send方法,并添加异常处理,避免因用户关闭DM导致命令崩溃。
修复后的代码
const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('warn') .setDescription('Choisi une qqun à warn.') .addUserOption(option => option .setName('cible') .setDescription('Le membre à warn') .setRequired(true)) .addStringOption(option => option .setName('raison') .setDescription('La raison du warn')) .setDefaultMemberPermissions(PermissionFlagsBits.BanMembers) .setDMPermission(false), async execute(interaction) { const target = interaction.options.getUser('cible'); const reason = interaction.options.getString('raison') || 'Aucune raison fournie'; try { // 直接通过User对象发送DM await target.send(`Vous avez été warn. Raison : ${reason}`); await interaction.reply(`${target.username} a été warn avec succès !`); } catch (error) { // 处理无法发送DM的异常情况 await interaction.reply(`Impossible d'envoyer un DM à ${target.username}. Vérifiez si ses messages privés sont ouverts.`); console.error('Erreur lors de l\'envoi du DM :', error); } }, };
额外注意事项
确保你的bot主文件已正确初始化并登录Client,示例主文件结构如下:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [GatewayIntentBits.Guilds] }); const { token } = require('./config.json'); // 加载命令、注册事件等逻辑... client.login(token);
内容的提问来源于stack exchange,提问作者ENDERastronaute
相关产品推荐
相关产品推荐

