(node:50868)UnhandledPromiseRejectionWarning:TypeError:无法读取属性“保存为null”

编程入门 行业动态 更新时间:2024-10-10 06:14:07

(node:50868)UnhandledPromiseRejectionWarning:TypeError:无法读取属性“<a href=https://www.elefans.com/category/jswz/34/1755641.html style=保存为null”"/>

(node:50868)UnhandledPromiseRejectionWarning:TypeError:无法读取属性“保存为null”

因此,我试图在不协调的情况下制作一个简单的XP级系统,每次有人发送消息时它将升级。我在消息事件中将其用于我的等级系统。级别定义为我使用猫鼬时的模式。有一个问题是它可以将其保存为没有数据的人,然后他们发送一条消息,创建XP之类的数据:0级:1,但随后当他们发送诸如XP之类的消息时不再更新:25等。错误是(节点:50868)UnhandledPromiseRejectionWarning:TypeError:无法读取属性“保存为null”

level1.findOne({ guildID: message.guild.id, userID: message.author.id }, async (err, res) => {
  if(err) return console.error(err)

  if(!res) {
    let newdata = new level1({
      guildID: message.guild.id,
      userID: message.author.id,
      level: 1,
      xp: 0,
      totalxp: 0,
      time: Date.now()
    })

    newdata.save()
    res = newdata
  } else {

    if (message.content.startsWith(`${prefix}`)) return;

  const generate = Math.floor(Math.random() * 18);
    (await level1.findOneAndUpdate({ guildID: message.guild.id, userID: message.guild.id }, { totalxp: res.totalxp += generate, xp: res.xp + generate, time: Date.now() })).save()

  if(res.xp >= res.level * 300) {
    (await level1.findOneAndUpdate({ guildID: message.guild.id, userID: message.guild.id }, { level: res.level++, xp: 0 })).save()
    message.channel.send(`Congratulations you are now Level **${res.level}**, ${message.author}`);
  }
}

})
回答如下:

您不需要将.save()添加到findOneAndUpdate

[findOneAndUpdate将更新db中的记录,而无需使用.save()

所以您的更新查询应该像

await level1.findOneAndUpdate(
    { guildID: message.guild.id, userID: message.guild.id }, // filter part
    { totalxp: res.totalxp += generate, xp: res.xp + generate, time: Date.now() } // update part
)

await level1.findOneAndUpdate(
    { guildID: message.guild.id, userID: message.guild.id },
    { level: res.level++, xp: 0 }
)

我认为这可以解决问题

关于代码的逻辑,我认为我们可以在更新查询之前使用某种逻辑将两个更新查询合并在一个查询中

我们可以在else部分中使用此逻辑

const generate = Math.floor(Math.random() * 18);

let updatePart = {
    totalxp: res.totalxp + generate, // this will be updated in all cases, even if the level is upgraded or not
    time: Date.now() // this will also be updated in all cases
}

let msg = ''; // a message to be returned after the update

if (res.xp + generate >= res.level * 300) {
    // if experience + random generate is greater than level * 300, 
    // then we need to update the level, and set the xp to 0

    updatePart.level = res.level++;
    updatePart.xp = 0;

    // update the msg with the new level
    msg = `Congratulations you are now Level **${res.level++}**, ${message.author}`

} else {
    // if experience + random generate is lower than level * 300, this means the level is the same
    // then we need to update the xp only
    updatePart.xp = res.xp + generate;

    // update the msg
    msg = `Experience updated successfully`
}

// just do the update query once, 
// If we just need to update the document, 
// we can use updateOne instead of findOneAndUpdate

await level1.updateOne( // you can use findOneAndUpdate also, it's okay
    { guildID: message.guild.id, userID: message.guild.id }, // filter part
    updatePart // this is the update object
)

message.channel.send(msg);

希望有帮助

更多推荐

(node:50868)UnhandledPromiseRejectionWarning:TypeError:无法读取属性“保存为null”

本文发布于:2024-05-07 15:00:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1756813.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:保存为   属性   node   UnhandledPromiseRejectionWarning   null

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!