MongoDB调用findOneAndUpdate更新文档无报错未生效问题求助
问题原因及解决方案
1. 核心问题:异步方法未等待执行
你调用的Guild.findOneAndUpdate是异步返回Promise的方法,当前代码没有加await关键字,会导致两个问题:
- 数据库更新操作还没执行完成,函数就已经提前返回了成功提示
- try/catch无法捕获该异步操作抛出的异常,所以即使更新出错你也看不到报错信息
2. 其他常见排查点
- 检查你的
GuildSchema中是否定义了whitelisted字段,mongoose默认会过滤掉Schema中未声明的字段更新请求,不会抛出错误但也不会生效 - 确认
args[1]的格式和数据库中存储的guildid格式完全匹配:比如数据库中guildid为Number类型,你传入的args[1]是String类型的话,匹配条件会找不到对应文档,自然不会触发更新 - 可以通过返回结果确认是否匹配到了目标文档,mongoose的更新操作返回结果中
matchedCount字段代表匹配到的文档数量,modifiedCount代表实际更新的文档数量
修正后代码
const Guild = require('../schemas/GuildSchema') module.exports = { name: 'whitelist', description: "whitelist", async execute(bot, message, args, PREFIX, Discord, settings, fs) { if (message.author.id != "173347297181040640") { return message.channel.send("Sorry only Bacio001 can whitelist!") } if (!args[1]) { return message.channel.send("No guild id given!") } try { // 新增await等待异步操作完成 const updateResult = await Guild.findOneAndUpdate( { guildid: args[1]}, { $set: { whitelisted : true } }, // 可选配置:new: true 会返回更新后的文档方便校验 { new: true } ) // 校验是否匹配到文档 if (!updateResult) { return message.channel.send(`未找到ID为${args[1]}的公会记录`) } } catch (e) { console.log(e); return message.channel.send("更新白名单失败,请查看后台报错") } let guild = bot.guilds.cache.get(args[1]); message.channel.send(`Whitelisted ${guild.id} with the name ${guild.name} !`) } }
内容的提问来源于stack exchange,提问作者bacio001
相关产品推荐
相关产品推荐

