【问题标题】:Variables exporting error in MongoDB errorMongoDB 错误中的变量导出错误
【发布时间】:2021-09-10 17:49:17
【问题描述】:

问题

我在下面提供了我的代码以供参考。我正在使用 MongoDBdiscord.js v12。所以基本上,我做了一个!info 命令,它显示了用户的一些一般信息。

此代码的作用是检查成员的角色,并根据他们的角色,计算他们的总申领时间(赠品等)。这里的问题在于 donator 角色。我不知道为什么我不能在db.findOne 块之外使用donates 变量。这里,data.content.length 显示了用户的总捐款,这意味着donates * 5+5 要求每次捐款的时间。

我的代码

const moment = require('moment');

module.exports = {
    name: 'info',
    async execute(client, message, args, Discord){
        const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]) || message.member;

        const db = require('../models/d-schema');
        db.findOne({ guildid: message.guild.id, user: member.user.id }, async(err, data)=>{
            if(err) throw err;
            if(data){
              const donates = parseInt(data.content.length);
            }
          })

        var DefaultTime = 10;
        var support = 0;
        var donate = 0;
        var boost = 0;
       
        const userRoles = member.roles.cache.map((r) => r.name);
        
        if (userRoles.includes("୨・supporter")) {
          support = 3;
        }
    
        if (userRoles.includes("୨・donator")) {
          donate = donates * 5;
        }
        
        if (userRoles.includes("୨・booster")) {
          boost = 10;
        }
    
        const TotalTime = DefaultTime + support + donate + boost;

        const embed = new Discord.MessageEmbed()
        .setThumbnail(member.user.displayAvatarURL( {dynamic: true} ))
        
        .addFields(
            {name: member.user.tag, value: member.user, inline: true},
            {name: 'Nickname', value: `${member.nickname !== null ? member.nickname : 'None'}`, inline: true},
            {name: 'Is Bot', value: member.user.bot, inline: true},

            {name: 'Joined', value: `${moment.utc(member.joinedAt).format("MMMM Do YYYY")}`, inline: true},
            {name: 'Created', value: `${moment.utc(member.user.createdAt).format("MMMM Do YYYY")}`, inline: true},
            {name: 'Claim Time', value: `${TotalTime} seconds`, inline: true},
        )

        .setFooter(`ID : ${member.user.id}`)
        .setTimestamp()
        .setColor('00ffcc')

        message.channel.send(embed)
    }
}

【问题讨论】:

    标签: mongodb discord.js


    【解决方案1】:

    您不能使用donates 变量,因为您将其声明 db.findOne() 块中。这称为variables scope。为了更好地理解,您可以阅读this answer

    如果你想在该块之外使用它,你必须事先声明,像这样:

    let donates;
    
    db.findOne({ guildid: message.guild.id, user: member.user.id }, async(err, data)=>{
                if(err) throw err;
                if(data){
                  donates = parseInt(data.content.length);
                }
              })
    

    现在您可以在 db.findOne() 块之外使用该变量 :)


    编辑:

    替代方式:

    异步使用函数会更容易。这样,所有内容都可以在同一个块中进行范围!

    示例:

    这两种方法将给出相同的结果:

    const data = await Model.findOne({ ... });
    console.log(data);
    
    Model.findOne({ ... }, (err, data) => {
      console.log(data);
    });
    

    【讨论】:

    • 非常感谢你^-^
    • 是的,Lioness100 确实是 OP
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2013-03-27
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多