В приложении Express.js мы хотели бы ограничить количество пользователей, которые слишком часто заходят на определенный маршрут, но только если они вызывают определенное исключение.Есть ли естественный способ сделать это в Express?
Вот более или менее то, что мы имеем сейчас, без ограничения скорости.
app.get(
"/api/method",
authenticationMiddleware,
handler
);
Промежуточное программное обеспечение ограничителя скорости обычно выглядит следующим образом.Он подсчитывает обращения и ошибки, если пользователь обращался к нему слишком много раз, прежде чем мы даже дойдем до обработчика.
app.get(
"/api/method",
authenticationMiddleware,
rateLimiterMiddleware, # <--- count, and tell them to go away if over limit
handler
);
Тем не менее, мы в порядке, если они обращаются к нему столько раз, сколько хотят -мы просто хотим запретить их, если они недавно вызвали много исключений.
В Express обработчики ошибок должны находиться в конце цепочки обработчиков.
Так что, кажется, мы должны поставить «охранник» впереди и «счетчик» обработки ошибок в конце.
app.get(
"/api/method",
authenticationMiddleware,
errorIfTooManyExceptionsByUser, # <--- tell them to go away if over the limit
handler,
countExceptionsForUser # <--- count
);
Это кажется не элегантным, а также немногохитро, поскольку две части промежуточного программного обеспечения, ограничивающего скорость, должны много знать друг о друге.Есть ли лучший способ?
Возможно, мы могли бы стать умнее и модифицировать обработчик (и), чтобы выполнять охрану и подсчет до и после их запуска?
app.get(
"/api/method",
authenticationMiddleware,
rateLimitErrors(handler) # <-- ???
)
Я что-то упустилили есть лучший способ сделать это?