Есть такой участок кода на сервере. Выполняется скрипт к бд и получаются данные в ответ. Когда идёт ответ сервера, то данные разбиваются по пакетам и посылаются на фронт. Однако, проблема в том, что если на сервере не группировать их в один большой объём, то на фронте будет всегда приходить только первый пакет. Проще говоря, нужно чтобы на фронте, когда идёт запрос к базе данных, данные подгружались постепенно, а не одним большим скопом. Возможно ли это? Если да, то как на фронте реализовать получение данных?
//...
const script = spawn('./script.sh')
script.stdout.on('data', (data) => {
if (scriptData == undefined) {
scriptData = data;
}
else scriptData += data;
})
//...
script.on('exit', function (code) {
if (!code) {
res.status(200);
res.end(scriptData);
}
})
//...
Со стороны фронта выглядит так:
var response = UrlFetchApp.fetch(url).getContentText();
url - адрес, куда стучаться и откуда приходит ответ.
Классический вариант решения подобных проблем - отправлять на сервер некий параметр, который информирует бэкэнд о том, какие данные брать из БД.
Например, на фронте:
var url = 'http://site.ru/getdata?skip=200&fetch=100';
var response = UrlFetchApp.fetch(url).getContentText();
На бэке читаете эти параметры из запроса и передаёте в скрипт. Примерно, как-то так.
Более конкретно подсказать не могу, т.к. мало подробностей от Вас.
Ответ был найден.
На фронте было всё в порядке, т.е. запрос отправлялся и ждал ответа от сервера.
Сама выдача ответа сервером была неправильной. Node.js я никогда не изучал, отсюда и вытекло.
На беке, как видно из строки, scriptData += data
, данные скапливаются и затем отправляются в строке res.end(scriptData)
. Здесь стоит пояснить цитированием из документации, что делает метод end
:
Этот метод сообщает серверу, что все заголовки и тело ответа были отправлены; этот сервер должен считать это сообщение завершенным.
Если необходимо, чтобы данные не одной частью отправлялись, то требуется использовать другой метод, который бы не завершал ответ от сервера, а передавал данные по мере их поступления и возможности переслать. Такой был: response.write
:
При первом response.write()
вызове он отправляет буферизованную
информацию заголовка и первый фрагмент тела клиенту. При втором
response.write()
вызове Node.js предполагает, что данные будут
передаваться в потоковом режиме, и отправляет новые данные отдельно.
То есть ответ буферизуется до первого фрагмента тела.
Это и есть решение.
script.stdout.on('data', data => {
res.write(data);
})
script.on('exit', code => {
if (!code) {
res.status(200);
res.end();
}
На данный момент всё работает и заметно, как данные постепенно загружаются. Ручаться на сколько это правильно реализовано не буду. Если можно как-то улучшить, то буду рад увидеть.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Вызываю функцию addListener из библиотеки WebMidi, третий параметр называется 'listener'Требуется, чтобы этот параметр был функцией (В моём случае это...
Как сделать, когда доскролишь до самого низа страницы, чтобы поменялся background, как отловить тот момент, когда уже уперлись в самый низ страницы...