Друг, спасибо тебе за это видео. Это самое понятное объяснение, какое только может быть. Пересматриваю его каждые +- пол года, когда работаю со стримами, и каждый раз ставлю лайк, который уже стоит👍
Спасибо! Было бы классно услышать от вас про работу с потоками в циклах. Например, когда нам нужно из нескольких файлов записать данные в один файл (стили, например)
@@YauhenKavalchuk Жаль, я тоже уже обыскался подобного материала, перенести данные из одного файла в другой могу и вроде все корректно, но стримы как буд то делают это параллельно, и никак не получается после каждого отдельного этапа чтение/запись добаить что -то по типу: Файл 1 открылся Файл 1 записался Файл 2 открылся Файл 2 записался Файл 3 открылся Файл 3 записался Получается только: Файл 1 открылся Файл 2 открылся Файл 3 открылся Файл 1 записался Файл 2 записался Файл 3 записался
Спасибо за видос. Но хочу обратить внимание на пару моментов. Чанк не обязательно должен быть буфером, можно в base64 кодировать. Буфер это просто бинарное представление данных в node.js. Stream в Nodejs !== Stream в HTTP. Стрим в ноде это просто класс предоставляющий возможность читать и писать почанково, а в HTTP нету стандарта, каждый свой придумывают как передавать почастям данные.
Для обработки ошибок лучше использовать pipeline из того же пакета, , а не pipe, по-моему начиная с 12 Ноды доступен. У pipe есть утечки памяти при ошибках во время исполнения
а что запускает чтение файла? В прошлом уроке было this.emit и это был вызов события и далее уже срабатывал logger.on. Тут же мы создаем поток чтения и назначаем его в переменную и тут же срабатывает readStream.on.... readStream это же прослушиватель? что его активирует, почему нет чтото вроде readStream.emit чтобы запустить чтение потока?
значит сжатый файл, который будет отправлятся юзеру, будет автоматический конвертирован в читательный текст или его нужно конвертировать самостаятельно
На сколько я понимаю, пайп это не дуплексный поток чтения. Может в качестве абстракции для новичков, таковым его и можно считать, но как по мне это только больше вводит в заблуждение. По дуплексному каналу обе стороны могут одновременно читать и писать. В случае же с пайпом - это вектор в котором одно сторона постоянно пишет, а вторая может только читать. Это наглядно видно на примере с bash пайпами, где для дуплексного чтения есть специальные "named pipes"
Возможно глупый вопрос, но можно ли каким то образом не вычитывать чанки в память, а писать сразу в файл? К чему я, если одновременно очень много пользователей начнут читать файл, не выжрет ли это всю оперативную память на сервере?
Нет смысла вешать обработчик события error дважды. Автор ошибся, сказав, что обработчик имеет смысл до pipe и после. Независимо от того, перед или после пайпа вы повесили обработчик ошибки, он вызовется.
Распаковать данные из последнего примера можно с помощью создания потока const decompressStream = zlib.createGunzip(). Нужно создать читающий поток из файла со сжатыми данными (const decompressReadStream = fs.createReadStream("директория-файла-со-сжатыми-данными")) и создать новый записывающий поток (const decompressWriteStream = fs.createWriteStream("директория-файла-для-записи-распакованных-данных")), далее с помощью схожей цепной структуры можно сначала распаковывать данные, а затем записать их в новый файл: decompressReadStream .pipe(decompressStream) .pipe(decompressWriteStream) На выходе получим распакованные данные в новом . txt файле (если захотите повторить этот код - лучше вынести его в чистый .js файл)
Друг, спасибо тебе за это видео. Это самое понятное объяснение, какое только может быть. Пересматриваю его каждые +- пол года, когда работаю со стримами, и каждый раз ставлю лайк, который уже стоит👍
Спасибо за отзыв
Спасибо! Я обычно на англоязычном ютубе ищу материал, но даже там нет нормального объяснения. А здесь всё идеально
Спасибо за отзыв
Мои поздравления! Вы наконец подобрали идеальную скорость подачи информации!
Спасибо
Чувак ты просто супер молодец! Как понятно все объяснил, таких мало в рунете. Огромное тебе спасибо, снимаю шляпу!
Спасибо за отзыв
Спасибо большое за видосы! Ну просто очень своевременно! Сам сейчас в лабе и как раз вчера срез по Buffer & Streams сдал! ))
👍 Пожалуйста
Спасибо. Было бы круто если бы было ещё больше реальных примеров использования с кодом
Во второй части курса будет больше практики
@@YauhenKavalchuk Вторая часть еще только в планах?
@@vasiuta тоже цікавить
Очень хороший урок. Спасибо!
Пожалуйста)
The video was awesome. You explained it well with examples.
Thanks!
нормас, а с 2х ваще то что нужно! спс! и да, первый :D!
Пожалуйста
Благодарю, очень доходчиво и понятно стало
Пожалуйста
Объяснил чётко спасибо
Пожалуйста
лайк этому видео, еще до просмотра...))
Благодарю)
Спасибо. Годное обучение
Пожалуйста
Супер понятно. Хотелось бы еще узнать как дописывать данные в файл, не пересоздавая его каждый раз при получении новой порции данных.
Не уверен что такое можно сделать нативно, возможно понадобится дополнительный npm
Дякую , курси чіткі!
Спасибо большое за отзыв
Спасибо! Было бы классно услышать от вас про работу с потоками в циклах.
Например, когда нам нужно из нескольких файлов записать данные в один файл (стили, например)
Спасибо за отзыв. Но курс закончен, не думаю что буду дополнять его новыми лекциями
@@YauhenKavalchuk Жаль, я тоже уже обыскался подобного материала, перенести данные из одного файла в другой могу и вроде все корректно, но стримы как буд то делают это параллельно, и никак не получается после каждого отдельного этапа чтение/запись добаить что -то по типу:
Файл 1 открылся
Файл 1 записался
Файл 2 открылся
Файл 2 записался
Файл 3 открылся
Файл 3 записался
Получается только:
Файл 1 открылся
Файл 2 открылся
Файл 3 открылся
Файл 1 записался
Файл 2 записался
Файл 3 записался
Спасибо за видос. Но хочу обратить внимание на пару моментов.
Чанк не обязательно должен быть буфером, можно в base64 кодировать. Буфер это просто бинарное представление данных в node.js. Stream в Nodejs !== Stream в HTTP. Стрим в ноде это просто класс предоставляющий возможность читать и писать почанково, а в HTTP нету стандарта, каждый свой придумывают как передавать почастям данные.
👍
Я тоже заметил, что чанк это совсем не буфер )))
Теперь за собес можно и не бояться))
👍
Отличное видео!
Спасибо за отзыв
Для обработки ошибок лучше использовать pipeline из того же пакета, , а не pipe, по-моему начиная с 12 Ноды доступен. У pipe есть утечки памяти при ошибках во время исполнения
Спасибо за подсказку
а что запускает чтение файла? В прошлом уроке было this.emit и это был вызов события и далее уже срабатывал logger.on. Тут же мы создаем поток чтения и назначаем его в переменную и тут же срабатывает readStream.on.... readStream это же прослушиватель? что его активирует, почему нет чтото вроде readStream.emit чтобы запустить чтение потока?
значит сжатый файл, который будет отправлятся юзеру, будет автоматический конвертирован в читательный текст или его нужно конвертировать самостаятельно
На сколько я понимаю, пайп это не дуплексный поток чтения. Может в качестве абстракции для новичков, таковым его и можно считать, но как по мне это только больше вводит в заблуждение. По дуплексному каналу обе стороны могут одновременно читать и писать. В случае же с пайпом - это вектор в котором одно сторона постоянно пишет, а вторая может только читать. Это наглядно видно на примере с bash пайпами, где для дуплексного чтения есть специальные "named pipes"
Возможно глупый вопрос, но можно ли каким то образом не вычитывать чанки в память, а писать сразу в файл? К чему я, если одновременно очень много пользователей начнут читать файл, не выжрет ли это всю оперативную память на сервере?
👍👍👍
👍
аааааааааааааааааа ). Спасибо!
Всегда пожалуйста
Подскажите, после прохождения данного курса можно считать свои знания по ноде базовыми ?
Можно
@@YauhenKavalchuk благодарю
А где вы изучили node.js?
По таким же курсам, статьям, документацию листал
@@YauhenKavalchuk понял, большое спасибо
Про CORS будет информация?)
Нет
Из-за чего может не сжиматься файл? Все вроде точно повторил, а созданный файл остается не сжатым.
Сверьте с кодом из репозитория
Подскажите пожалуйста почему handleError вызывается дважды но срабатывает единожды?
Потому что как только он падает в первом случае, выполнение останавливается. Поэтому второй и не вызывается
Нет смысла вешать обработчик события error дважды. Автор ошибся, сказав, что обработчик имеет смысл до pipe и после. Независимо от того, перед или после пайпа вы повесили обработчик ошибки, он вызовется.
Почему мы импортируем модуль 'fs' а не 'node:fs' ???
commonJS: const fs = require('node:fs');
ESM: import * as fs from 'node:fs';
модуль "util" оказывается устарел (deprecated). Классический вариант "extends" лучше использовать. ES6
👍
Распаковать данные из последнего примера можно с помощью создания потока const decompressStream = zlib.createGunzip().
Нужно создать читающий поток из файла со сжатыми данными (const decompressReadStream = fs.createReadStream("директория-файла-со-сжатыми-данными")) и создать новый записывающий поток (const decompressWriteStream = fs.createWriteStream("директория-файла-для-записи-распакованных-данных")), далее с помощью схожей цепной структуры можно сначала распаковывать данные, а затем записать их в новый файл:
decompressReadStream
.pipe(decompressStream)
.pipe(decompressWriteStream)
На выходе получим распакованные данные в новом . txt файле (если захотите повторить этот код - лучше вынести его в чистый .js файл)
👍