discord.js中/collection命令无法加载MongoDB数据至Embed问题
问题背景
- Discord机器人每小时发送一张随机名人图片,服务器用户可认领该名人
- MongoDB数据库文档包含三个核心字段:
playerDBName:名人姓名times:用户拥有该名人的次数userNameClaim:认领该名人的用户ID
功能需求
/collection命令需实现以下逻辑:
- 用户调用命令时,查询数据库中
userNameClaim等于当前用户ID(interaction.user.id)的文档 - 提取符合条件文档的
playerDBName值 - 生成Embed消息:
- 标题:
${interaction.user.username}'s Collection - 描述:
这是你的名人收藏
- 标题:
- 为每个符合条件的名人添加Embed字段,显示用户拥有该名人的次数(
times字段值)
遇到的问题
调用/collection命令时,机器人发送的Embed仅显示标题和描述,不显示字段。尝试的代码如下:
if (interaction.isCommand()) { if (interaction.commandName === 'collection') { const playersCollection = await playersSchema.find({ userNameClaim: interaction.user.id }); const embedCollection = new EmbedBuilder() .setTitle(`${interaction.user.username}'s Collection`) .setDescription('Here are the players you have claimed:'); playersCollection.forEach(playersSchema => { embedCollection.addField(playersSchema.players.playerDBName, `Claimed ${player.times} time(s)`); }); interaction.reply({ embeds: [embedCollection] }); }}
问题修复
代码存在两个关键错误导致字段不显示,修正后的代码如下:
if (interaction.isCommand()) { if (interaction.commandName === 'collection') { const playersCollection = await playersSchema.find({ userNameClaim: interaction.user.id }); const embedCollection = new EmbedBuilder() .setTitle(`${interaction.user.username}'s Collection`) .setDescription('这是你的名人收藏:'); // 遍历查询结果,为每个名人添加字段 playersCollection.forEach(doc => { embedCollection.addField(doc.playerDBName, `已认领 ${doc.times} 次`); }); // 处理无收藏的兜底情况 if (playersCollection.length === 0) { embedCollection.addField('暂无收藏', '你还没有认领过任何名人哦'); } interaction.reply({ embeds: [embedCollection] }); } }
错误说明
- 字段访问错误:原代码中
playersSchema.players.playerDBName是错误的,数据库文档本身直接包含playerDBName字段,无需通过players属性访问 - 变量未定义:原代码中
player.times引用了未定义的player变量,应使用遍历当前的文档对象doc.times - 变量名冲突:遍历变量名
playersSchema与数据模型重名,改为doc避免混淆
内容的提问来源于stack exchange,提问作者RealDR7
相关产品推荐
相关产品推荐

