ограничьте выполнение функции для указанного пользователя одним разом в минуту

#javascript #node.js

Вопрос:

У меня есть такой маршрут для выполнения функции:

 router.post('/send-verification-again', sendVerificationAgain);
 

В приведенной выше функции у нас есть адрес электронной почты или номер телефона учетной записи, которую мы хотим подтвердить.

Это выполнит функцию отправки электронной почты или sms пользователю с его/ее проверочным кодом, хорошо?

Очевидно, мы не хотим, чтобы пользователь мог отправлять более одного запроса в минуту по этому маршруту, верно?

Как я могу ограничить выполнение функции для указанного пользователя одним в минуту?

 function sendVerificationAgain(email) {
  // for each specific email here the function can be executed one time per minute
}
 

Это очень распространенная функциональность, существует ли какое-либо соглашение для этого?

Комментарии:

1. Хороший ответ Кельвина ниже. Вы также можете ознакомиться с такими библиотеками, как: npmjs.com/package/express-rate-limit

Ответ №1:

Вы можете просто сохранить электронное письмо на минуту и проверить, сохранено ли оно:

 const recentlySent = new Set();

function sendVerificationAgain(email) {
    if (recentlySent.has(email)) return;
    recentlySent.add(email);
    setTimeout(() => recentlySent.delete(email), 60e3);
    // ...
}
 

Вы также можете сначала нормализовать электронное письмо, например, в нижнем регистре.

Для получения дополнительной информации посмотрите «debounce» в программном смысле