discord.js中mongoose查询返回nickname为undefined的问题
问题根源
返回nickname is undefined是两个代码逻辑错误导致的:
- Mongoose所有数据查询方法都是异步执行,直接调用
User.findOne()返回的是处于Pending状态的Promise对象,不是实际的查询结果文档,自然读不到nickname属性 - 空值判断顺序错误:你是先尝试取
data.nickname,再判断data是否存在,就算查询无结果也会先执行取值逻辑,直接触发undefined问题
修复代码
给消息事件回调加上async标记,用await等待查询结果返回后再执行后续逻辑,同时调整空值判断的顺序:
client.on("message", async msg => { if (msg.content === "!n"){ // 等待数据库查询返回实际文档数据 const data = await User.findOne({ userID: msg.author.id }) // 先判断是否查到对应数据,再读取字段 if (!data) return msg.reply({content: 'You have no data'}) const nick = data.nickname; msg.reply({content: `Your nickname is ${nick}`}) } });
额外优化提示:Schema定义里不需要手动声明_id: mongoose.Schema.Types.ObjectId,Mongoose会默认给每个文档自动生成该类型的_id字段,手动声明反而容易在新增用户数据时因为漏传_id触发校验报错。
内容的提问来源于stack exchange,提问作者Nevada
相关产品推荐
相关产品推荐

