Skip to content

Reference errors appearing when importing discord bot modules

Ok so I am writing a music bot due to the more populars getting shutdown and the remaining being pretty useless. I split up the code in separate files for better readability and all that and so am using modules to import and export function & variables and when I run the program using node index.js it tells me that I’m getting a reference error and that I need to initialized a variable before use even though it’s already been initialized.

This is my index.js code:

//Dependency imports
import { Client, Intents } from 'discord.js';
import ytmp3 from 'youtube-mp3-converter'
import puppeteer from 'puppeteer'
import fse from 'fs-extra';
import {} from 'dotenv/config'

//Import global variables
import playCommand from './src/play.js'

//Exported global variables
export const token = process.env.TOKEN;
export const client = new Client({ 
    intents:[Intents.FLAGS.DIRECT_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES, 
             Intents.FLAGS.DIRECT_MESSAGE_REACTIONS, Intents.FLAGS.GUILDS, 
             Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS, 
             Intents.FLAGS.DIRECT_MESSAGE_REACTIONS] 
    });

export const globalCommands = {
    play: "!p"
}



client.login(token)

client.on('ready', () => {
    console.log(`Logged on using ${client.user.tag}`)
    client.user.setActivity("Crying in JS", { type:"PLAYING" })
});

and this is my play.js code:

import { token, client } from '../index.js'

//Dependency imports
import { Client, Intents } from 'discord.js';
import { createAudioPlayer } from '@discordjs/voice';
import ytmp3 from 'youtube-mp3-converter';
import fse from 'fs-extra';
import path from 'path';
const __dirname = path.resolve();
import puppeteer from 'puppeteer';
import {} from 'dotenv/config'

client.login(token)

//Declaration of global variables
let musicFiles = fse.readdirSync(path.join(__dirname, 'musicSaves'))

//Takes in message content, downloads song, adds to queueArray 
export default function getCommand(message){

}

//declare local function below here

//Tries to find link in message using Regex
function getLink(messageLink, message){
    const urlRegex = /https?://(www.)?[[email protected]:%._+~#=]{1,256}.[a-zA-Z0-9()]{1,6}b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/;
    let link = messageLink.match(urlRegex);

    link == null ? convertToMp3(link) : findSongName(message.content);
}

//Converts source to mp3 to be played by audio player
async function convertToMp3(inputLink){
    const convertLinkToMp3 = youtubeMp3Converter('../musicSaves')
    const pathToMp3 = await convertLinkToMp3(inputLink)
}

//If link isn't found; tries to find source using puppeteer
async function findName(message){
}

Lastly, this is the error I get:

ReferenceError: Cannot access 'client' before initialization
    at file:///C:/Users/alexa/Desktop/Fortnite-Wrap-Bot--v2/src/play.js:15:1
    at ModuleJob.run (node:internal/modules/esm/module_job:185:25)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:281:24)
    at async loadESM (node:internal/process/esm_loader:88:5)
    at async handleMainPromise (node:internal/modules/run_main:65:12)

I’ve tried to find someone with the same problem online but none of them have had the issue in the same context. What I’ve figured out is that when I import the getCommand function from play.js that’s when it breaks, I’ve tried running both files seperately and they still break if the function is imported into index.js. I would remove the function import from index.js but I can’t since it’s how I plan to call the rest of the functions in the rest of the play.js file.

Answer

From what @ouroborus commented this was circular dependency issue. I solved this by creating a new file name global-vars in which I placed all global variables needed by both of them so that they depend on a third file and not eachother, it also allowed for slightly cleaner code.