Чтение файла
Для чтения файла NodeJS необходимо использовать модуль под названием "fs". Приведём пример кода для считывания файла под названием "file.txt" и вывода его содержимого в консоль:let fs = require('fs');
let fileContent = fs.readFileSync('file.txt', 'utf8');
console.log(fileContent);
Первым аргументом метода "readFileSync" передаётся абсолютный или относительный адрес файла, который необходимо считать. Второй параметр - это кодировка файла для считывания.Наличие "Sync" в названии метода "readFileSync" означает, что используется синхронный метод чтения файла. То есть файл блокируется на время операции для всех пользователей. Мы использовали именно этот метод сейчас, потому что его легче реализовать (меньше кода)
В отличии от PHP, в котором запросы от пользователей обрабатываются параллельно, в NodeJS выполняется только одна копия кода. К примеру, если установить бесконечный цикл вывода данных (например, в групповом чате), то первый пользователь, который запустит скрипт увидит цикл с самого начала, а остальные только с времени своего входа (запроса к скрипту).
Из-за наличия синхронности "Sync" код из примера выше будет выполняться для всех пользователей одновременно. Попробуем переписать его, чтобы сделать параллельное выполнение. Получится так:
let fs = require('fs');
fs.readFile('file.txt', 'utf8', function(error, fileContent){
if(error) throw error; // ошибка чтения файла, если есть
console.log(fileContent); // содержимое файла
});
// если файл большой, то действия ниже успеют выполнится до того
// как будет выведено содержание файла через console.log(fileContent)
console.log('Тише, мыши, кот на крыше');
В этом примере чтение файла выполняется асинхронно! То есть если файл достаточно большой, то при выполнения кода примера сначала мы увидим в консоли строку "Тише, мыши, кот на крыше", а только потом содержимое файла.
Обратите внимание на третий параметр функции "fs.readFile". В NodeJS часто используются callback функции, у которых в первом параметре указывается название переменно, куда попадает ошибка выполнения.
Запись файла
Для асинхронной записи данных в файл существует метод "writeFile" модуля "fs". При этом файл будет принудительно создан при отсутствии, либо вся информация будет удалена из него, если она есть. Первым параметром этой функции передаётся название файла, вторым данные для записи. При этом в третьем параметре необходимо передать callback функцию с единственным параметром - переменной, в которую запишется ошибка. Продемонстрируем простейший пример записи в файл:let fs = require('fs');
fs.writeFile('file.txt', 'Тише, мыши, кот на крыше', function(error){
if(error) throw error; // ошибка чтения файла, если есть
console.log('Данные успешно записаны записать файл');
});
Обратите внимание, что во второй строчке этого примера callback функцию можно записать, опусти слово "function" и даже скобки вокруг (error). Но тогда надо поставить знак =>
(получится "стрелочная" функция). Чтобы получилось так:
fs.writeFile('file.txt', 'Тише, мыши, кот на крыше', (error) => {
Если параметр только один, то круглые скобки и вовсе можно убрать (и нельзя если параметров несколько):
fs.writeFile('file.txt', 'Тише, мыши, кот на крыше', error => {
Но обычно круглые скобки оставляют, чтобы было нагляднее, что это функция.Если в первом параметре "writeFile" указать несуществующий путь (папку, которой нет), то будет возвращена ошибка. Потому что "writeFile" умеет создавать только файлы, но не папки.
Чтение и запись файла
Попробуем объединить два предыдущих примера: считать данные из файла, произвести с ними действие и записать обратно в тот же файл. Для тривиального решения этой задачи стоит использовать синхронный метод чтения и записи, чтобы код не обрабатывался дальше, пока не будут выполнены действия. В таком случае достаточно будет всего лишь объединить оба примера сиз предыдущих параграфов этой статьи. Поэтому усложним задачу и используем синхронные методы чтения и записи. А чтобы не нарушить последовательности выполнения, поместим запись в callback функцию чтения. Получится так:let fs = require('fs');
fs.readFile('file.txt', 'utf8', function(error, fileContent){
if(error) throw error; // ошибка чтения файла, если есть
console.log(fileContent); // содержимое файла
let toWrite = fileContent + 'Тише, мыши, кот на крыше';
fs.writeFile('file.txt', toWrite, function(error){
if(error) throw error; // ошибка чтения файла, если есть
console.log('Данные успешно записаны записать файл');
});
});
В результате выполнения этого кода в конец файла "file.txt" будет записана строка "Тише, мыши, кот на крыше". Если требуется сделать перенос строки, то используйте символ конца строки "\n". То есть достаточно будет написать так:
let toWrite = fileContent + "\n" + 'Тише, мыши, кот на крыше';
Обязательно ставьте двойные скобки "\n"
вокруг символа переноса строки. Если записать одинарные кавычки, то конструкция будет воспринята как два отдельных символа, а не символ переноса строки.