Нужно ли снова вызывать readFileSync (), если я использую writeFile () в другом файле js? - PullRequest
0 голосов
/ 17 мая 2018

Я создаю диссон-бота, и в настоящее время он настроен так:

Есть index.js, который обрабатывает команды.

Если команда X, она переходит к X.js

Если команда Y, она переходит к Y.js

У меня есть X.js и Y.js, которые читают и пишут в один и тот же файл JSON (в несогласованных областях), используя fs.readFileSync () и fs.writeFile ()

fs.readFileSync () вызывается только один раз в каждом X и Y при запуске командного сценария. чтение / запись прекрасно работает из одного и того же файла с этим одним вызовом, но я не проверял, как это работает с несколькими сценариями, записывающими в один и тот же файл одним вызовом в начале.

Полагаю, это не сработает?

И, предположив, что это не сработает, какое решение вы, ребята, предложите?

Вызов fs.readFileSync () в X / Y каждый раз, когда вызывается команда X / Y (Насколько это эффективно? Сейчас я не очень часто вызываю команды - возможно, не чаще, чем пару раз в час), но если в конечном итоге это становится общедоступным, может быть довольно много вызовов X / Y в секунду. Это может привести к значительным нагрузкам на файловую систему / бот / и т. д.? Полагаю, нет, просто убедившись!)

Создание внешнего сценария для обработки чтения + записи (X / Y будет вызывать этот сценарий для данных и вывода данных для записи.)

Использование разных файлов для каждого скрипта (ах, я бы на самом деле не хотел этого делать !!)

Может быть, другое решение? Кто знает ...

Если кто-то сделал что-то подобное / знает решение, пожалуйста, не стесняйтесь писать :) Спасибо!

1 Ответ

0 голосов
/ 20 мая 2018

То, что вы хотите сделать, называется «Горячая перезагрузка». Хотя горячая загрузка сложна.

Если вам потребуется путь к тому же файлу после его изменения, старый модуль будет возвращен, так как он уже будет в памяти, это предотвращает чрезмерный дисковый ввод-вывод. Если вам удастся загрузить новый модуль, вы также можете очистить старый модуль


Вместо этого я бы предложил вам использовать пакет типа nodemon , который перезапустит все приложение при изменении файла:

# You may need to use sudo on linux/macOS or Administrative 
npm i -g nodemon 

# Restart your Terminal
nodemon ./path/to/your/file.js

Из вашего описания я предполагаю, что вы берете пользовательский ввод и используете его для динамического создания пути к файлу. Это может быть плохой идеей, потому что я мог бы использовать команду типа !../../index.js и, возможно, испортить ваш бот.

Для обработки я сам использую немного более сложную систему для обработки команд, но это может быть хорошим началом.

const commands = {};

const modules = load_modules_from_directory();

for ( const module of modules ) {
    commands[ module.name ] = module.function;
}

function messageHandler( message ) {
    if( !is_valid_command( message.content ) )
        return

    const command_string = 
        remove_prefix_and_get_first_word( message.content );

    if ( commands.hasOwnProperty( command_string ) ) 
        commands[ command_string ]( message );
}
...