Работа с текстовыми файлами в 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 команды с теми же вытекающими  по поводу асинхронности и синхронности.

Важно:

  1. Если файла для записи не было, то он создастся.
  2. При повторном вызове текст в файле будет дописываться. В таком виде даже просто в одну строчку. Чтобы сделать перенос на новый рядок можно использовать такой оператор ‘\n’.
  3. Может быть такое, что в текущий момент наш файл записывается через команду 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) и дополнительных параметрах для более гибкой настройки можно прочесть на хабре.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *