ReferenceError: Cannot access 'fs' before initialization
ReferenceError: Cannot access 'fs' before initialization
我尝试在 discordjs 机器人 (v13) 上使用 fs,但我遇到了一个奇怪的错误。
在我可以 console.log 我的 fs 对象和错误之间有 3 行字面意思:
// 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;
}
});
错误:
/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
我错过了什么?提前致谢。
该特定错误意味着在您的函数范围内的其他地方(未显示在您问题的代码中),您可能有 const fs = ...
或 let fs = ...
并因此试图重新定义 fs
在此功能范围内隐藏了更高范围的 fs
.
该错误意味着您试图在该范围内的 const fs = ...
或 let fs = ...
定义执行之前使用变量 fs
。与 var
不同(定义在内部提升),您不能在使用 let
或 const
.
声明之前使用变量
根据我们可以看到的代码,我猜您是在 switch
语句中的其他 case
处理程序之一或包含此函数的其他地方执行此操作switch
声明。如果您不使用大括号为每个 case
处理程序定义新范围,那么它们都在同一范围内,并且所有 const
或 let
定义都可能相互干扰。
所以,在这个函数的其他地方寻找 fs
的重新定义。而且,如果这对您来说不是很明显,那么 post 发生错误的此函数的所有代码。
这是一个重现完全相同错误的 stand-alone 示例。这就是您应该寻找的东西:
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;
}
// or a redefinition of fs here (in the same function) would also cause the error
当你运行这个时,它给出了这个错误:
ReferenceError: Cannot access 'fs' before initialization
或者,类似地,如果您在包含 switch
语句但在 switch
语句之后的同一函数中的其他地方定义了 fs
。那也会导致同样的问题。
我尝试在 discordjs 机器人 (v13) 上使用 fs,但我遇到了一个奇怪的错误。
在我可以 console.log 我的 fs 对象和错误之间有 3 行字面意思:
// 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; } });
错误:
/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
我错过了什么?提前致谢。
该特定错误意味着在您的函数范围内的其他地方(未显示在您问题的代码中),您可能有 const fs = ...
或 let fs = ...
并因此试图重新定义 fs
在此功能范围内隐藏了更高范围的 fs
.
该错误意味着您试图在该范围内的 const fs = ...
或 let fs = ...
定义执行之前使用变量 fs
。与 var
不同(定义在内部提升),您不能在使用 let
或 const
.
根据我们可以看到的代码,我猜您是在 switch
语句中的其他 case
处理程序之一或包含此函数的其他地方执行此操作switch
声明。如果您不使用大括号为每个 case
处理程序定义新范围,那么它们都在同一范围内,并且所有 const
或 let
定义都可能相互干扰。
所以,在这个函数的其他地方寻找 fs
的重新定义。而且,如果这对您来说不是很明显,那么 post 发生错误的此函数的所有代码。
这是一个重现完全相同错误的 stand-alone 示例。这就是您应该寻找的东西:
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;
}
// or a redefinition of fs here (in the same function) would also cause the error
当你运行这个时,它给出了这个错误:
ReferenceError: Cannot access 'fs' before initialization
或者,类似地,如果您在包含 switch
语句但在 switch
语句之后的同一函数中的其他地方定义了 fs
。那也会导致同样的问题。