@Bombesko
Чайник

Как узнать о новых событиях?

Всем привет.
Есть одна программка со старым квадратным интерфейсом, задача: переделать интерфейс (хотя бы часть).
Буду использовать React/Node js/Firebird(бд).
Суть вопроса: надо создать "слушатель" базы данных. И как-то отправить это на фронт.
В базе данных формируются новые события (от контроллера), как мне узнать что там появилось новое? Как потом это сразу передать на фронт? Типо смотри у меня тут массив пополнился - дорисуйся.
В общем про создания слушателя мыслей вообще нету. А про автоматическую отправку на фронт - это надо использовать сокеты? Или есть что-то лучше?
Подскажите пожалуйста, спасибо!
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 2
syxme
@syxme
Можно использовать классический long polling
Принцип такой:
В таблице где у тебя обновляются, добавляются данные должно быть поле что-то типо updateTime (время последнего обновления) Если запись создаётся то updateTime = createTime.

Для реализации long polling нужно чтоб сервер не отправлял ответ пока не пройдет timeout(В среднем 5-15сек) или не появятся новые данные.

Пример реализации на nodejs
function subscribe(req,res,params,callback){
	var timeStamp;
	if (params.timestamp){  // Если передали timestamp c которого начинать выборку данных
		timeStamp = new Date(parseInt(params.timestamp));
	}else{
		timeStamp = new Date();
	}
	var isConnected = true;
	req.on('close', function() { // Если пользователь закрыл соединение
		isConnected = false;
	});
	console.log("timeStamp",timeStamp);
	(function startEvents(cb,time){

		if (!isConnected){
			console.log("Connection close_end pool");
			return;
		}
		model.db.find({}).sort({updateTime :-1}).exec(function (err,items){ // SELECT * FROM datatable ORDER BY updateTime DESC
			if (items.length>0){
				cb(null,{
					items:items,
					timestamp:new Date(items[0].updateTime).getTime()  // Возвращаем время для следующего соединения
				});
			}else {
				if (time > 10) {
					cb(null, {
						items:[],
						timestamp:new Date().getTime()  // Возвращаем время для следующего соединения 
					});
				} else {
					setTimeout(function (){
						startEvents(rQuery, group, cb, time + 1);
					},1000);
				}
			}
		});

	})(callback,0)
}

Первый запрос будет примерно такой: localhost:8080/controller/subscribe

{items:[],timestamp:1634803048151} //  Если ничего не изменилось 
{items:[1,2,3,4,5],timestamp:1634803048151} //  Если что-то изменилось

Следующий запрос будет
localhost:8080/controller/subscribe?timestamp=1634...
И так до бесконечности
Ответ написан
Комментировать
@sadsdasdasdsadsadsadsadsa
WEB developer
Если есть возможность использовать сокеты - используйте, long polling это уже так сказать когда других вариантов нет, но это явно не лучше сокетов
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы