Mongoose无法保存Discord命令选项至MongoDB问题求助
问题原因与解决方案
核心问题:字段名大小写不匹配
你的MongoDB数据库无法保存新增选项数据,本质是Mongoose Schema定义的字段名与创建文档时使用的字段名大小写不一致:
- Schema里定义的是
Achievements(首字母大写)和TimeToComplete(首字母大写) - 但执行
gameInfos.create()时传入的是小写的achievements和timetocomplete
Mongoose会严格按照Schema的字段规则存储数据,未在Schema中定义的字段(大小写不同会被判定为不同字段)会被自动忽略,因此这两个选项的数据无法存入数据库。
额外问题:imageURL参数获取错误
你在Discord命令中定义的选项名是全小写的imageurl,但代码中用options.getString("imageURL")(大小写混合)获取值,这会导致imageURL的值为undefined,同样无法正常存入数据库。
修正后的代码
主命令execute函数修正版
async execute(interaction) { const { options } = interaction; let currentDate = new Date(); console.log(currentDate); const gameTitle = options.getString("gamename"); const day = options.getInteger("releaseday"); const month = options.getString("releasemonth"); const year = options.getInteger("releaseyear"); // 修正:选项名改为全小写的imageurl,与命令定义一致 const imageURL = options.getString("imageurl"); const achievements = options.getInteger("achievements"); const timetocomplete = options.getInteger("timetocomplete"); let releaseDate = `${month}/${day}/${year}`; let Difference_In_Time = new Date(releaseDate).getTime() - new Date(currentDate).getTime(); let Difference_In_Days = Math.round(Difference_In_Time / (1000 * 3600 * 24)); try { // 修正:字段名与Schema保持一致,首字母大写 await gameInfos.create({ Name: gameTitle, ReleaseDate: releaseDate, TimeToRelease: Difference_In_Days, ImageURL: imageURL, Achievements: achievements, TimeToComplete: timetocomplete }); console.log(timetocomplete); await interaction.reply("游戏已成功添加到数据库!"); console.log( `${chalk.bold.blue( "[LOG]" )} 已添加游戏发布提醒:${gameTitle},发布日期${day}/${month}/${year},距离现在还有${Difference_In_Days}天。` ); } catch (error) { // 添加错误捕获,便于排查问题 console.error(chalk.bold.red("[ERROR]"), "添加游戏失败:", error); await interaction.reply("添加游戏失败,请查看控制台日志。"); } },
补充建议
- 始终保持Schema字段名与代码中使用的字段名完全一致(包括大小写);
- 所有数据库操作建议包裹在
try/catch块中,方便捕获并排查异常; - 可以给Schema字段添加默认值,避免因参数缺失导致数据异常。
内容的提问来源于stack exchange,提问作者Evan Axon
相关产品推荐
相关产品推荐

