#node.js #discord.js #fs
#node.js #discord.js #fs
Вопрос:
следующий код [ниже] находится в файле .js, основанном в папке «Reloaders», и я пытаюсь добраться до папки «Commands».
Тем не менее, при каждой попытке, которую я делаю, я получаю ошибку:
Error: ENOENT: no such file or directory, scandir '../Commands'
Код
const categories = fs.readdirSync("../Commands");
Вывод дерева
C:.
---lib
| ---Collections
| ---Commands
| ---Events
| ---Handlers
| ---Reloaders
| ---Settings
Полный код
var fs = require("fs");
const chokidar = require("chokidar");
const { basename } = require("path");
const Logger = require("../Handlers/LogHandler");
const { commands, aliases } = require("../Collectors/DiscordCollectors")
const categories = fs.readdirSync("../Commands");
const CommandReloader = async () => {
categories.forEach(category => {
chokidar.watch(`../Commands/${category}`, {
awaitWriteFinish: true
}).on("change", (file) => {
const commandName = basename(file, ".js")
delete require.cache[require.resolve(process.cwd() `/lib/Commands/${category}/${commandName}.js`)];
delete require.cache[require.resolve(process.cwd() `/lib/Commands/${category}/${commandName}.js`)];
commands.delete(process.cwd() `/lib/Commands/${category}/${commandName}.js`);
Logger.log("Command Reloader", `Deleted ${commandName} from ${category}.`);
console.log(commands.get(commandName))
const props = require(process.cwd() `/lib/Commands/${category}/${commandName}.js`);
commands.set(commandName, props);
props.help.aliases.forEach(alias => {
aliases.set(alias, commandName);
});
Logger.log("Command Reloader", `Reloaded ${commandName} from ${category}.`);
});
});
};
module.exports.start = CommandReloader;
Проблема с кэшем
const commandName = basename(file, ".js")
delete require.cache[require.resolve(`${__dirname}/../Commands/${category}/${commandName}.js`)];
commands.delete(`${__dirname}/../Commands/${category}/${commandName}.js`);
console.log(commands.get(commandName))
Logger.log("Command Reloader", `Deleted ${commandName} from ${category}.`);
Проблема с выводом из кэша:
[24/10/2020 22:10:03] [ Command Loader ] | Loaded lol from General.
[24/10/2020 22:10:06] [ Command Reloader ] | Deleted lol2 from Admin.
{
run: [Function],
help: {
name: 'lol',
aliases: [ 'l', 'o', 'l' ],
description: 'Lol',
usage: '(command name) ',
category: 'Admin'
}
}
[24/10/2020 22:10:06] [ Command Reloader ] | Reloaded lol2 from Admin.
Комментарии:
1. Путь должен быть относительно рабочего каталога, а не файла .js.
2. Вы можете сделать это относительно текущего файла, записав его следующим образом
`${__dirname}/../Commands`
3. Дело в том, что весь код выглядит так: [отредактированный вопрос]
4. @mpen Это сработало бы только в том случае, если папка Commands существовала в загрузчиках; это просто проверка этой теории.
5. Это не имеет смысла. Если этот код находится в
Reloaders
каталоге, то__dirname
естьC:/lib/Reloaders
, следовательно${__dirname}/..
, увеличивается на один каталог, чтоC:/lib/
, таким образом, должно быть полнымC:/lib/Commands
(или реалистичноC:/lib/Reloaders/../Commands
, но это одно и то же)