Рубрики
Без рубрики

Читайте файлы с Node.js

Автор оригинала: Scott Robinson.

Одним из самых распространенных вещей, которые вы захотите сделать с любым языком программирования, открыт и прочитал файл. С большими языками это довольно просто, но для ветеранов JavaScript это может показаться немного странным. В течение многих лет JavaScript был доступен только в браузере, поэтому разработчики интерфейса могут быть знакомы только с FialeReader API или похожие.

Node.js, как вы, наверное, знаете, сильно отличается от вашего типичного JavaScript в браузере. Он имеет свой собственный набор библиотек, предназначенных для обработки задач ОС и файловых систем, таких как открытие и чтение файлов. В этой статье я покажу вам, как использовать Node.js для чтения файлов. В частности, мы будем использовать ФС Модуль, чтобы сделать только это.

Есть два способа открыть и прочитать файл, используя ФС модуль:

  • Загрузите все содержимое сразу (буферизация)
  • Постепенно нагрузка содержимое (потоковое)

Каждый из этих методов будет объяснен в следующих двух разделах.

Содержание буферизации с fs.readfile

Это самый распространенный способ прочитать файл с Node.js, особенно для начинающих, благодаря своей простоте и удобству. Хотя, как вы приедете, чтобы реализовать в следующем разделе, это не обязательно является лучшим или наиболее эффективным.

Вот быстрый пример, используя Fs.readfile :

var fs = require('fs');

fs.readFile('my-file.txt', 'utf8', function(err, data) {
    if (err) throw err;
    console.log(data);
});

данные Аргумент обратного вызова содержит полное содержимое файла, представленного как строку в UTF8 формат. Если вы опускаете UTF8 Аргумент полностью, то метод просто вернет необработанное содержимое в Буфер объект. Удаление UTF8 Аргумент в вышеуказанном коде (и предполагающий my-file.txt содержал строку “Привет!”), мы получили этот вывод:

$ node read-file.js

Возможно, вы заметили, что Fs.readfile Возвращает содержимое в обратном вызове, что означает, что этот метод проходит асинхронно. Это следует использовать, когда это возможно, чтобы избежать блокировки основного выполнения нити, но иногда вы должны делать вещи синхронно, в этом случае узел Case предоставляет вам Readfilesync метод.

Этот метод работает точно так же, за исключением того, что содержимое файла возвращается непосредственно из вызова функции, и нить выполнения заблокирована, пока он загружает файл. Обычно я использую это в стартовых разделах моих программ (например, когда мы загружаем файлы конфигурации) или в командных строках, где блокируя основной нить, не является большой сделкой.

Вот как загрузить файл синхронно с узлом:

var fs = require('fs');

try {
    var data = fs.readFileSync('my-file.txt', 'utf8');
    console.log(data);    
} catch(e) {
    console.log('Error:', e.stack);
}

Обратите внимание, что с блокировкой (синхронному) вызовом, мы должны использовать попробуй ... поймать Чтобы обработать любые ошибки, в отличие от неблокирующейся (асинхронной) версии, в которой были прошедшие ошибки в качестве аргументов.

Кроме того, как эти методы возвращают данные и обрабатывают ошибки, они работают очень одинаково.

Потоковое содержимое с fsceletseadstream

Второй способ открыть и прочитать файл – открыть его как Поток используя FskcreateSeadstream метод. Все потоки узлов – это экземпляры Eventemitter Объект, позволяющий вам подписаться на важные события.

Читаемый объект потока может быть полезен для многих причин, некоторые из которых включают в себя:

  • Меньшая память следа Отказ Поскольку данные целевого файла загружаются в кусочки, не так много памяти, необходима для хранения данных в буфере.
  • Быстрое время отклика Отказ Для чувствительных к времени приложения время между запросом и ответом имеет решающее значение. Потоки сокращают время отклика (особенно для больших файлов), поскольку им не нужно ждать, чтобы загрузить весь файл перед возвратом данных.
  • Данные трубопроводы Отказ Обозначение потока позволяет использовать общий интерфейс между производителями и потребителями данных, чтобы пройти эти данные по каналам. Это очень похоже на Unix трубы концепция.

Хотя это действительно не очень трудно использовать потоки, они могут быть немного запутаны и не так интуитивно понятны, как Fs.readfile метод. Вот «Hello World» потоковой передачи файлов:

var fs = require('fs');

var data = '';

var readStream = fs.createReadStream('my-file.txt', 'utf8');

readStream.on('data', function(chunk) {
    data += chunk;
}).on('end', function() {
    console.log(data);
});

Этот код делает именно то, что делает код в первом разделе, за исключением того, что мы должны «собирать» куски данных, прежде чем печатать его на консоль. Если ваш файл довольно маленький, то вы, вероятно, когда-либо получаете только один кусок, но для больших файлов, таких как аудио и видео, вам придется собирать несколько кусков. Это тот случай, когда вы начнете замечать реальное значение потоковых файлов.

Обратите внимание, что пример, который я показал выше, в основном поражает цель использования потока, так как мы в конечном итоге собираем данные в буфере (переменной), но, по крайней мере, это дает вам представление о том, как они работают. Лучший пример, показывающий сильные стороны потоков файлов, можно увидеть здесь, в экспресс-маршруте, который обрабатывает запрос на файл:

var fs = require('fs');
var path = require('path');
var http = require('http');

var staticBasePath = './static';

var staticServe = function(req, res) {
    var fileLoc = path.resolve(staticBasePath);
    fileLoc = path.join(fileLoc, req.url);
    
        var stream = fs.createReadStream(fileLoc);

        stream.on('error', function(error) {
            res.writeHead(404, 'Not Found');
            res.end();
        });

        stream.pipe(res);
};

var httpServer = http.createServer(staticServe);
httpServer.listen(8080);

Все, что мы здесь делаем, открыт файл FskcreateSeadstream и трубайте его до объекта ответа, res Отказ Мы можем даже подписаться на Ошибка . События и справиться с теми, как они случаются. Это гораздо лучший способ обработки файлов, как только вы узнаете, как правильно использовать его. Для более полного примера и объяснения вышеуказанного кода проверьте эту статью на Создание статических файловых серверов с узлом Отказ

Заключение

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

Какой у вас предпочитаемый метод обработки файлов? Как вы использовали ручьи в прошлом? Дайте нам знать об этом в комментариях!