【问题标题】:Error: ENOTDIR: not a directory, scandir './commands/setWelcome.js'错误:ENOTDIR:不是目录,scandir './commands/setWelcome.js'
【发布时间】:2021-12-19 10:35:08
【问题描述】:

我正在尝试创建一个审核机器人,但我遇到了一个错误,显示我的项目中没有命令和 setWelcome 文件,即使我有。这是完整的错误-

node:internal/fs/utils:344
    throw err;
    ^

Error: ENOTDIR: not a directory, scandir './commands/setWelcome.js'
    at Object.readdirSync (node:fs:1390:3)
    at Object.<anonymous> (/home/runner/Him/index.js:12:26)
    at Module._compile (node:internal/modules/cjs/loader:1095:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1147:10)
    at Module.load (node:internal/modules/cjs/loader:975:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47 {
  errno: -20,
  syscall: 'scandir',
  code: 'ENOTDIR',
  path: './commands/setWelcome.js'
}

这是我在 index.js 中的代码 -

const fs = require('fs');
const Discord = require('discord.js');

const client = new Discord.Client({ intents: ["GUILDS", "GUILD_MESSAGES"] });

client.commands = new Discord.Collection();

const commandFolders = fs.readdirSync('./commands');

for (const folder of commandFolders) {
    const commandFiles = fs.readdirSync(`./commands/${folder}`).filter(file => file.endsWith('.js'));
    for (const file of commandFiles) {
        const command = require(`./commands/${folder}/${file}`);
        client.commands.set(command.name, command);
    }
}

client.once('ready', (c) => {
    console.log(`Logged in as ${c.user.tag}`);
});

client.on('messageCreate', message => {
//My command handler code here
});
client.login(process.env.TOKEN);

而且,我的 setWelcome.js 文件完全是空的

这是我的项目目录-

index.js//file
commands//folder and then inside commands 
   setWelcome.js //file

是的,我确实有 package.json 和 package-lock.json 文件。 我会非常感谢任何帮助的人,谢谢! 顺便说一句..我在这个项目中使用 repl.it

【问题讨论】:

    标签: javascript node.js discord.js


    【解决方案1】:

    您似乎正试图以两种相互冲突的方式循环浏览您的文件夹(您正在使用两个嵌套的 for 循环)。如果 commands 文件夹包含包含您要定位的文件的子文件夹,这将是有意义的。但是,由于您的命令文件直接位于 commands 文件夹中,因此一个循环就足够了。

    readdirSync 函数需要一个目录路径并返回其内容列表,如fs documentation 中所述,但./commands/${folder} 已经是commands 文件夹中文件的路径。以下应该会有所帮助:

    \\create a list of files in command directory that end with .js
    
    const commandFiles = fs.readdirSync(`./commands/`).filter(file => file.endsWith('.js'));
    
    \\loop over items in the list
    
    for (const file of commandFiles) {
        const command = require(`./commands/${file}`);
        client.commands.set(command.name, command);
    }
    

    注意:./commands/ 中的尾部反斜杠可能应该省略。如果有请评论。

    【讨论】:

    • 嘿,是的,它有效,我创建了一个名为 WelcomeSystem 的文件夹,然后将 setWelcome.js 文件移动到 WelcomeSystem 文件夹中,它没有显示任何错误并且它有效。非常感谢您发现错误并帮助我!
    猜你喜欢
    • 2017-12-29
    • 2022-01-10
    • 2022-08-02
    • 2016-10-05
    • 2021-04-27
    • 2021-12-04
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多