@gcj

Как реализовать таймер на стороне сервера?

Всем привет!
Суть скрипта: есть вопрос и поле с ответом, человек отвечает на вопросы, если правильно, то переходит к следующему.
Если пользователь тупит, то через каждые 5 минут ему дается подсказка.
Проблема: контингент юзверов достаточно прошаренный, поэтому не хочется реализовывать таймер на стороне клиента, т.к. можно легко получить эндпоинт по которому запрашивается подсказка и тем самым выполнить запрос, не дожидаясь 5 мин. Поэтому решено запускать таймер на стороне сервера (Node.js)
Вопрос: Подскажите как лучше всего организовать этот момент. Естественно, таймер должен запускаться отдельно для каждого юзера, есть мысль что-то с socket.io придумать. В общем, как бы вы сделали?

Заранее спасибо за любой ответ.
  • Вопрос задан
  • 943 просмотра
Пригласить эксперта
Ответы на вопрос 3
shmatuan
@shmatuan
8 year of Web, 5 years of Vue
socket.io хороший вариант, но только по истечению 5ти минут, не каждую секунду
Как вариант ещё - хешировать на сервере начало таймера (или конец - смотря как сам таймер реализован) с солью, сохранять хеш на стороне фронта и время с солью на стороне сервера, по истечсению таймера на фронте отправлять на сервер запрос о подсказке с проверкой этого хеша
Ответ написан
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
  1. Сохранить в БД время начала теста
  2. На клиенте запустить таймер
  3. По истечении таймера отправить запрос на сервер
  4. Сервер при получении запроса проверяет время начала теста и если заданное время прошло — отправляет ответ, иначе отказывает
Ответ написан
@Azperin
Дилетант
Если вопросы выплевываются также через сокет, то можно при подключении добавить этому сокету объект.
{
  questionNumber: 1,
  nextTipOn: Date.now() + 300000;
}

При получении вопроса на клиенте у него запускается таймер через setTimeout, который делает запрос для подсказки. Ну а на сервере уже просто будет даты сравнить.

Плюс у вас всегда будет статистика, кто и какой вопрос сейчас решает, что можно будет вывести на страницу.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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