Задать вопрос
@Bombesko
Чайник

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

Всем привет.
Есть одна программка со старым квадратным интерфейсом, задача: переделать интерфейс (хотя бы часть).
Буду использовать React/Node js/Firebird(бд).
Суть вопроса: надо создать "слушатель" базы данных. И как-то отправить это на фронт.
В базе данных формируются новые события (от контроллера), как мне узнать что там появилось новое? Как потом это сразу передать на фронт? Типо смотри у меня тут массив пополнился - дорисуйся.
В общем про создания слушателя мыслей вообще нету. А про автоматическую отправку на фронт - это надо использовать сокеты? Или есть что-то лучше?
Подскажите пожалуйста, спасибо!
  • Вопрос задан
  • 69 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 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 это уже так сказать когда других вариантов нет, но это явно не лучше сокетов
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы