Работа с текстовыми файлами в Node js
Нам нужно подключить встроенный модуль fs для работы с файлами (просто сверху добавить строку):
const fs = require('fs');
Команды для чтения
Теперь можно читать файлы:
const fs = require('fs'); fs.readFile('data.json', 'utf-8', (err, content) => { console.log(content) }); const content = fs.readFileSync('data.json', 'utf-8'); console.log(content);
Здесь показано 2 варианта обращения к файлам для чтения. readFile()
являются асинхронной функцией и возвращает ответ сразу после получения, пока другие скрипты тоже выполняются. Третьим параметром он принимает функцию-коллбэк, которая обработает ответ и ошибки.
readFileSync()
же синхронный и блокирует выполнение остального кода до завершения. И в таком формате обычно не используется для node express / webserver и т.д. Но встечал мнение, что это удобнее выглядит для людей, пришедших из других языков.
Команды для записи
const fs = require('fs'); fs.writeFile('data.json2', JSON.stringify({name: 'Ivan'}), (err, content) => { console.log(err) }); fs.writeFileSync('data.json3', JSON.stringify({name: 'Ivan'})); console.log(content);
Здесь мы снова видим 2 команды с теми же вытекающими по поводу асинхронности и синхронности.
Важно:
- Если файла для записи не было, то он создастся.
- При повторном вызове текст в файле будет дописываться. В таком виде даже просто в одну строчку. Чтобы сделать перенос на новый рядок можно использовать такой оператор ‘\n’.
- Может быть такое, что в текущий момент наш файл записывается через команду writeFile, а мы пытаемся его считать. В итоге мы ничего не получим, так как функция writeFile забрала для работы файл себе (он его в этот момент перезаписывает).
Команда для чтения потока
Что-то большое придется считывать постепенно. Для этого нужно использовать стримы (англ. stream – поток). Так как Node js – событийно ориентированное окружение, то по сути нам нужно открыть стрим и повесить на него обработчики. Вот так это может выглядеть:
const fs = require('fs'); let readStream = fs.createReadStream("data.json"); readStream.on('open', () => { //console.log(chunk) }); readStream.on('data', (data) => { console.log(data); //Buffer console.log(data.toString()); // content }) readStream.on('error', (err) => { res.end(err); })
Первый слушатель (‘open’) выполнит функцию из второго переданного параметра, когда поток будет открыт.
Второй слушатель (‘data’) будет выполнять переданные вторым параметром функции по мере получения данных с файла. В нашем случае, если файл достаточно большой, то в консоль будут постепенно выводиться данные буфера в виде чанок (по умолчанию это символы в кодировке UTF-8), и уже читаемое содержимое файла (буфер, кастованый в строку).
Последний слушатель (‘error’), как можно легко догадаться, отлавливает ошибки. При этом не упадет runtime, что тоже очень важно.
Больше о других видах стримов, помимо Readable (Writable, Duplex, Transform) и дополнительных параметрах для более гибкой настройки можно прочесть на хабре.