Size: a a a

Node.js — русскоговорящее сообщество

2020 January 10

AK

Andrey Korobeynikov in Node.js — русскоговорящее сообщество
Vladyslav Kaminskyi
Открываешь поток и пишешь в файлик данные. Поподробнее в доке можна почитать
Алгоритм такой:
Юзер заходить на УРЛ и получает файл.csv
Бэк достает из БД данные. Большое колличество.
И отдает это все файлом
источник

AK

Andrey Korobeynikov in Node.js — русскоговорящее сообщество
Konstantin
Ничего не понял. Тебе приходит запрос на урл для дампа с базы, так? Делаешь дамп через промис, пишешь в файл в памяти, отдаёшь это через генерированную урл. А если по божески.

Приходит запрос > дамп файл > аплоад на S3 > получаешь линк > кидаешь с редиректом ответ в хедерах.

А если очень по божески, пишешь крон в воркере, воркер дампит и аплоадит файлы через перепись или отдельно маркируя по таймстампу и потом выдаёшь урл для шаринга с S3 на каждый запрос
В том то и дело юзер должен зайти по УРЛ и получить файлик, типо как нажал на кнопку
источник

Ð

Ð in Node.js — русскоговорящее сообщество
Andrey Korobeynikov
Алгоритм такой:
Юзер заходить на УРЛ и получает файл.csv
Бэк достает из БД данные. Большое колличество.
И отдает это все файлом
не знаю что тамм за квери билдер у тебя, но для этой цели логично использовать курсор бд, например такой https://node-postgres.com/api/cursor
источник

Ð

Ð in Node.js — русскоговорящее сообщество
создаешь курсор, читаешь его и шлешь в респонс строки
источник

Ð

Ð in Node.js — русскоговорящее сообщество
после всех заголовков с контент тайпом и шапки csv
источник

AK

Andrey Korobeynikov in Node.js — русскоговорящее сообщество
Ð
создаешь курсор, читаешь его и шлешь в респонс строки
так мне поток данных приходит из бд. все отлично я из них могу сдлеать массив объектом. Как мне потом дальше в fs.createReadStream( СЮДА не ПОЛОЖИШЬ этот массив)
источник

AK

Andrey Korobeynikov in Node.js — русскоговорящее сообщество
как дальше быть
источник

Ð

Ð in Node.js — русскоговорящее сообщество
а причем тут вообще fs?
источник

AZ

Artem Zuev in Node.js — русскоговорящее сообщество
Andrey Korobeynikov
Алгоритм такой:
Юзер заходить на УРЛ и получает файл.csv
Бэк достает из БД данные. Большое колличество.
И отдает это все файлом
не в обиду, но так не делается - одно дело получить некий блок данных, и совсем другое потоком хреначить дофига строк... чем не подходит более привычный и логичный формат "считать - упаковать - отдать" ?
источник

AK

Andrey Korobeynikov in Node.js — русскоговорящее сообщество
Хорошо, прошу объяснить
источник

Ð

Ð in Node.js — русскоговорящее сообщество
если у тебя база отдает готовый readStream, то пиши его в writeStream боди респонса и все
источник

AZ

Artem Zuev in Node.js — русскоговорящее сообщество
Ð
а причем тут вообще fs?
скорее всего из какого-то примера по работе с потоками взято и недопонято/недоисправлено
источник

AK

Andrey Korobeynikov in Node.js — русскоговорящее сообщество
Artem Zuev
скорее всего из какого-то примера по работе с потоками взято и недопонято/недоисправлено
Как писал выше - я не совсем понимаю этой фишки с потоками))
источник

AK

Andrey Korobeynikov in Node.js — русскоговорящее сообщество
так если я напишу createWriteStream() node открывает поток на запись в файл
источник

Ð

Ð in Node.js — русскоговорящее сообщество
потоки это просто потоки байт, которые читаются через небольшой буфер (чанками), файл это поток байт, из базы тоже идет поток байт, и в респонс браузеру тоже идет поток байт, чтобы передать файл для скачивание тебе надо сделать респонсу заголовок контент-тайп csv, потом в боди респонса послать поток содержащий текст этого файла
источник

AZ

Artem Zuev in Node.js — русскоговорящее сообщество
давай так - если вариант решения не принципиален (нужно отдать мноооого данных в ответе на запрос) - то ты суть задачи обрисуй нам что ли... "кто" делает запрос к серверу за этими даннными - другой процесс/сервер или пользователь из браузера?
источник

AK

Andrey Korobeynikov in Node.js — русскоговорящее сообщество
Есть эндпоинт /api/getCSVFile
зайдя на этот урл у юзера начинается загрузка файла из браузера
источник

AZ

Artem Zuev in Node.js — русскоговорящее сообщество
если нужно выгрузить дофига данных, то лично я бы точно не стал делать это через респонс... - любой сбой соединения и никакие потоки не помогут + занятые декрипторы... брррр....
источник

Ð

Ð in Node.js — русскоговорящее сообщество
ты сделал загрузку файла из файла на диске?
источник

Ð

Ð in Node.js — русскоговорящее сообщество
Artem Zuev
если нужно выгрузить дофига данных, то лично я бы точно не стал делать это через респонс... - любой сбой соединения и никакие потоки не помогут + занятые декрипторы... брррр....
а что сбой соединение разве не останавливает врайтстрим?
источник