Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Как получать статус процесса с бекенда (https://javascript.ru/forum/node-js-io-js/85311-kak-poluchat-status-processa-s-bekenda.html)

JobLack 18.06.2023 23:01

Как получать статус процесса с бекенда
 
Друзья, на бекенде (Node JS) выполняется весьма длительный процесс обработки данных. Как на фронтенде (React) в течение этого процесса показывать не только спиннер, но и прогресс бар с процентом завершения процесса. Другими словами как "заставить" бекенд переодически возвращать статус процесса еще до его завершения?
Спасибо.

Aetae 19.06.2023 00:04

Есть много разных способов.
Самый примитивный: сделать на сервере эндпоинт типа /progress/<id>, который будет возвращать текущий статус и после запуска долбить этот эндпоинт раз в секунду или типа того.
По сложнее: использовать websocket\Server Sent Events и слать оповещения о прогрессе там.
Не слишком хороший(потому что перезагрузка вкладки всё сломает): не завершать запрос при запуске процесса, а постепенно досылать прогресс в него(типа long polling).

JobLack 19.06.2023 14:20

Цитата:

Сообщение от Aetae (Сообщение 552445)
Есть много разных способов.
Самый примитивный: сделать на сервере эндпоинт типа /progress/<id>, который будет возвращать текущий статус и после запуска долбить этот эндпоинт раз в секунду или типа того.
По сложнее: использовать websocket\Server Sent Events и слать оповещения о прогрессе там.
Не слишком хороший(потому что перезагрузка вкладки всё сломает): не завершать запрос при запуске процесса, а постепенно досылать прогресс в него(типа long polling).

Спасибо, действительно попробую в setInterval вставить ендпоинт

JobLack 20.06.2023 13:45

Цитата:

Сообщение от Aetae (Сообщение 552445)
Есть много разных способов.
Самый примитивный: сделать на сервере эндпоинт типа /progress/<id>, который будет возвращать текущий статус и после запуска долбить этот эндпоинт раз в секунду или типа того.
По сложнее: использовать websocket\Server Sent Events и слать оповещения о прогрессе там.
Не слишком хороший(потому что перезагрузка вкладки всё сломает): не завершать запрос при запуске процесса, а постепенно досылать прогресс в него(типа long polling).

Начал писать ...возникли вопросы...Сам процесс запускается с фронтенда по эндпоинту
router.post("/process", authenticateToken, async (req, res) => {...})
Внутри него в цикле идет обработка JSONа и формирование репорта.
В этом цикле вставил несколько
вызовов функции, в которую передаю процент завершения. (это все в Node)..
Но как из фронтенда получать данные из этой функции. Можно конечно в базу данных писать процент завершения...и отдельным запросом считывать это значение с фронтенда...но это неверно будет неправильно.

Aetae 20.06.2023 15:12

Если процесс долгий (больше ~30 секунд) - то только так и надо.

Если не такой уж долгий, то можно и как ты сейчас пытаешься.
По современному: так https://developer.mozilla.org/en-US/...adable_streams
По классике: XMLHttpRequest onreadystatechange по readyState === XMLHttpRequest.LOADING читаешь .resposeText.
Ну и можно не слать какие-то конкретные значения, а просто имитировать загрузку(отправляя заранее заданное нужное кол-во байт) и слушать событие progress.


Часовой пояс GMT +3, время: 05:26.