В приложении 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) # <-- ???
)
Я что-то упустил или есть лучший способ сделать это?