Есть такой участок кода на сервере. Выполняется скрипт к бд и получаются данные в ответ. Когда идёт ответ сервера, то данные разбиваются по пакетам и посылаются на фронт. Однако, проблема в том, что если на сервере не группировать их в один большой объём, то на фронте будет всегда приходить только первый пакет. Проще говоря, нужно чтобы на фронте, когда идёт запрос к базе данных, данные подгружались постепенно, а не одним большим скопом. Возможно ли это? Если да, то как на фронте реализовать получение данных?
//...
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();
}
На данный момент всё работает и заметно, как данные постепенно загружаются. Ручаться на сколько это правильно реализовано не буду. Если можно как-то улучшить, то буду рад увидеть.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости