NodeJS. Что такое pipe().
Всем привет! В этой статье мы рассмотрим, что такое pipes в NodeJS, в чем преимущества и как это использовать.
Описание
Для начала давайте вспомним, что мы делали в прошлой статье. Мы создали поток для чтения и поток для записи, считывали данные в потоке для чтения с файла readMe.txt, слушали событие на получение данных и, как только оно срабатывало, мы использовали поток для записи, чтобы загрузить информацию, полученную с файла readMe.txt в файл writeMe.txt.
Этот процесс, где мы считываем данные с одного потока и записываем их в другой, в NodeJS встречается достаточно часто, и поэтому была придумана такая штука как pipes.
Что такое pipes
Это элегантное решение, которое позволяет собирать кусочки информации в буфер и, когда он заполнен, сразу отправлять их в поток для чтения, минуя событие получения данных, которое мы писали в прошлый раз.
Давайте теперь перепишем наш предыдущий код с использованием pipe:
var myReadStream = fs.createReadStream(__dirname + '/readMe.txt', 'utf8');
var myWriteStream = fs.createWriteStream(__dirname + '/writeMe.txt');
myReadStream.pipe(myWriteStream);
Если вы запустите этот код, то увидите, что он работает так же, как и раньше.
Отправка данных клиенту
Теперь вспомним наш сервер, который мы тоже уже писали в одной из статей. Сейчас он нам пригодится, чтобы таким же образом, как мы делали это с файлами, отправлять данные напрямую пользователю. Давайте сразу перейдем к коду:
var server = http.createServer(function(request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
var myReadStream = fs.createReadStream(__dirname + '/readMe.txt', 'utf8');
myReadStream.pipe(response);
});
server.listen(3000, '127.0.0.1');
console.log('Прослушивание порта 3000');
Здесь мы создаем сервер, отправляем заголовки, а также данные при помощи метода pipe() клиенту по адресу 127.0.0.1:3000.
Если вы теперь запустите код и перейдете по адресу выше, то увидите те данные, что были в файле readMe.txt.
В чем преимущества данного подхода
Как вы уже, наверное, заметили, первое преимущество – это лаконичность кода. Нам теперь не нужно писать несколько потоков, писать для них события и отслеживать данные. Написали всего лишь один метод, и все работает.
Второе преимущество – это производительность. Поскольку данный метод уже встроен в платформу NodeJS, то он достаточно хорошо оптимизирован и, следовательно, используя его, вы повышаете производительность своего приложения.
Заключение
Итак, сегодня мы рассмотрели, что такое pipe в NodeJS, в чем его преимущества и как использовать данный метод.
Спасибо за внимание!
-
- Михаил Русаков
Комментарии (1):
Очень странно. Данные отдаются кусочками и тут myReadStream.on('data', (chunk){ тут кусочками - chunk'ами }) и тут тоже кусочками myReadStream.pipe(myWriteStream) Так в чём тогда разница???
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.