Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

ReferenceError: Cannot access 'fs' before initialization

I try to use fs on a discordjs bot (v13) but I have a strange error.

I have literally 3 lines between the moment when I can console.log my fs object and the error :

// Get FS
const fs = require('fs');

// Recieves commands
client.on('interactionCreate', async interaction => {
    console.log(fs); // OK
    switch(interaction.commandName) {
        // Get list of all maps for this server
        case 'maps':
            const pngfiles = fs.readdirSync('./maps/').filter(f => f.endsWith(".png")); // NOT OK !!!!!!!
            response = "**List all maps available in this server:**\n\n\n"+pngfiles.join("\n")+"\n";
            break;
    }
});

And the error :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

/home/chenille33/DPW/app.js:156
                const pngfiles = fs.readdirSync('./maps/').filter(f => f.endsWith(".png"));
                                 ^

ReferenceError: Cannot access 'fs' before initialization
    at Client.<anonymous> (/home/chenille33/DPW/app.js:156:34)
    at Client.emit (node:events:527:28)
    at InteractionCreateAction.handle (/home/chenille33/DPW/node_modules/discord.js/src/client/actions/InteractionCreate.js:74:12)
    at module.exports [as INTERACTION_CREATE] (/home/chenille33/DPW/node_modules/discord.js/src/client/websocket/handlers/INTERACTION_CREATE.js:4:36)
    at WebSocketManager.handlePacket (/home/chenille33/DPW/node_modules/discord.js/src/client/websocket/WebSocketManager.js:351:31)
    at WebSocketShard.onPacket (/home/chenille33/DPW/node_modules/discord.js/src/client/websocket/WebSocketShard.js:444:22)
    at WebSocketShard.onMessage (/home/chenille33/DPW/node_modules/discord.js/src/client/websocket/WebSocketShard.js:301:10)
    at WebSocket.onMessage (/home/chenille33/DPW/node_modules/ws/lib/event-target.js:199:18)
    at WebSocket.emit (node:events:527:28)
    at Receiver.receiverOnMessage (/home/chenille33/DPW/node_modules/ws/lib/websocket.js:1137:20)

Node.js v18.0.0

What I’ve missed ? Thanks in advance.

>Solution :

That specific error implies that somewhere else in your function scope (not shown in the code in your question), you likely have const fs = ... or let fs = ... and are thus attempting to redefine fs in this function scope which is hiding the higher scoped fs.

The error means that you’re trying to use the variable fs BEFORE it’s const fs = ... or let fs = ... definition in this scope have been executed. Unlike with var (where definitions are internally hoisted), you can’t use a variable before it’s declaration with let or const.

Based on the bit of code we can see, I would guess you’re doing this in one of the other case handlers in your switch statement or somewhere else in the function containing this switch statement. When you don’t use braces to define a new scope for each case handler, then those are ALL within the same scope and all const or let definitions there can interfere with each other.

So, look for a redefinition of fs somewhere else in this function. And, if that isn’t obvious to you, then post all the code for this function where the error occurs.


Here’s a stand-alone example that reproduces that exact same error. This is the kind of thing you should be looking for:

let greeting = "hi";
const fs = require('fs');

switch (greeting) {
    case "hi":
        fs.readFileSync("temp.js");
        console.log("got hi");
        break;
    case "goodbye":
        const fs = require('fs');       // this redefinition causes the error
                                        // when the "hi" case executes
        console.log("got goodbye");
        break;
    default:
        console.log("didn't match");
        break;
}

When you run this, it gives this error:

ReferenceError: Cannot access 'fs' before initialization

Or, similarly, if you were defining fs somewhere else in the same function containing the switch statement, but after the switch statement. That would also cause the same problem.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading