Darshan B
Darshan B

Reputation: 807

Variables exporting error in MongoDB error

Question

I have provided my code below for reference. I'm using MongoDB and discord.js v12. So basically, I have made a !info command which shows some general info of the user.

What this code does is, it checks through the member's roles, and regarding which role they have, it calculates their total claim time (for giveaways etc.). The problem here, is with the donator role. I can't figure out why I can't use the donates variable outside the db.findOne block. Here, data.content.length shows the total donates of the users, which means donates * 5 is +5 claim time for each donate.

My Code

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)
    }
}

Upvotes: 1

Views: 80

Answers (1)

Toasty
Toasty

Reputation: 1880

You cannot use the donates variable because you are declaring it inside the db.findOne() block. This is called variables scope. For better understanding you can read this answer.

If you want to use it outside of that block, you have to declare it beforehand, like this:

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);
            }
          })

Now you're able to use that variable outside of the db.findOne() block :)


Edit:

Alternative way:

It would be easier to use the function asynchronously. That way, everything can be scoped in the same block!

Example:

These two methods will give the same results:

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

Upvotes: 3

Related Questions