Discord机器人Help命令部署服务器后报错:无法发送空消息
Discord机器人Help命令部署后报错:Cannot send an empty message
问题描述
本地开发的Discord机器人Help命令运行正常,但部署到服务器后触发报错:DiscordAPIError: Cannot send an empty message,完整错误栈如下:
throw new DiscordAPIError(request.path, data, request.method, res.status); ^ DiscordAPIError: Cannot send an empty message at RequestHandler.execute (/home/container/Lee-Goldway/node_modules/discord.js/src/rest/RequestHandler.js:154:13) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async RequestHandler.push (/home/container/Lee-Goldway/node_modules/discord.js/src/rest/RequestHandler.js:39:14) { method: 'post', path: '/channels/833629858210250813/messages', code: 50006, httpStatus: 400 }
对应命令代码:
const Discord = require("discord.js"); const recon = require('reconlx'); const rpages = recon.ReactionPages const moment = require('moment'); const fs = require('fs'); module.exports = class HelpCommand extends BaseCommand { constructor() { super('help', 'moderation', []); } async run(client, message, args) { const y = moment().format('YYYY-MM-DD HH:mm:ss') const sayEmbed1 = new Discord.MessageEmbed() .setTitle(`example`) const sayEmbed2 = new Discord.MessageEmbed() .setTitle(`example`) const sayEmbed3 = new Discord.MessageEmbed() .setTitle(`example`) const sayEmbed5 = new Discord.MessageEmbed() .setTitle(`example`) const sayEmbed4 = new Discord.MessageEmbed() .setTitle(`example`) const sayEmbed6 = new Discord.MessageEmbed() .setTitle(`example`) .setDescription("[A készítőm Weboldala](https://istvannemeth1245.wixsite.com/inde/) ") try { await message.delete(); const pages = [{ embed: sayEmbed1 }, { embed: sayEmbed2 }, { embed: sayEmbed3 }, { embed: sayEmbed4 }, { embed: sayEmbed5 }, { embed: sayEmbed6 }]; const emojis = ['◀️', '▶️']; const textPageChange = true; rpages(message, pages, textPageChange, emojis); } catch (err) { console.log(err); message.channel.send('Nem tudom ki írni az üzenetet'); } const contetn = ` [${y}] - ${message.author.username} használta a help parancsot. `; fs.appendFile('log.txt', contetn, err => { if (err) { console.err; return; } }) } }
解决方案
1. 修复await语法错误
代码中await与message.delete()分两行书写,JavaScript会自动插入分号,导致await未正确等待消息删除完成,后续代码可能在消息已被删除的状态下执行,触发发送空消息的错误。修正为:
await message.delete();
2. 同步依赖版本
本地与服务器的discord.js、reconlx版本不一致可能导致API调用逻辑冲突。执行以下步骤同步版本:
- 本地生成版本锁定文件:
npm install - 服务器端安装匹配版本依赖:
npm ci
3. 确保Embed内容非空
服务器环境下可能因编码问题导致Embed内容解析异常,为每个Embed补充基础描述,保证内容有效:
const sayEmbed1 = new Discord.MessageEmbed() .setTitle(`example`) .setDescription("帮助页面第一页");
4. 优化错误处理逻辑
原错误处理中,若message已被删除,message.channel.send会失效。提前保存频道对象,避免依赖已删除的消息对象:
async run(client, message, args) { const targetChannel = message.channel; // 提前保存频道引用 // ... 其他代码 try { await message.delete(); // ... ReactionPages调用逻辑 } catch (err) { console.log(err); targetChannel.send('无法发送消息'); // 使用保存的频道对象发送提示 } // ... 日志代码 }
5. 修正日志代码的拼写错误
日志代码中存在两处拼写错误,修正后避免日志功能异常:
const content = ` [${y}] - ${message.author.username} használta a help parancsot. `; fs.appendFile('log.txt', content, err => { if (err) { console.error(err); // 修正console.err为console.error(err) return; } })
内容的提问来源于stack exchange,提问作者InDeKnoW
相关产品推荐
相关产品推荐

