Задать вопрос
@nosok12

Как обрабатывать параллельные запросы от одного и того же пользователя в NodeJS?

Например:

app.post('/login', (req, res) => {
// I want to check.
// If we are already authenticating this user from the given IP(or fingerprint).
// then res.send('Authentication already in progress');
});

Меня интересует, как правильно обработать запрос в такие моменты. Я читаю "Secure your NodeJS WEB application - Karl Duuna". Он приводит такой пример:

// Map our authentications
var inProgress = {};
app.post('/login', function (req, res, next) {
var key = req.ip + ':' + req.body.username;
// check if we are already authenticating this user from the given IP
if(inProgress[key]) {
req.session.error = 'Authentication already in progress';
res.redirect('/');
return;
}
inProgress[key] = true;
И т.д.

Но конечно не советует хранить inProgress в памяти приложения.
Тогда можно ли например сделать отдельную коллекцию в mongodb, которая будет хранить документы вида:
inProgress: true,
fingerprint: some_string_id

И в коде написать (псевдокод):

app.post('/login', async (req, res) => {
// Если запрос на аутентификацию уже был и еще не отработан, редиректим
// основываемся например на fingerprint-е
if(in_progress(fingerprint)){
res.redirect('/login', { errors: ['Authentication already in progress'] });
return;
}
// Если параллельно никто никаких запросов на аутентификацию не делал
// добавляем in_progress документ в mongodb
// после обработки запроса, обязательно удаляем из базы данных
in_progress[inProgress] = true;
in_progress[fingerprint] = some_string_id;

Или все это слишком намудрено и будет большая нагрузка на сервер и БД? Или может вообще в NodeJS такое не надо делать? Но если не надо делать, почему в довольно популярной книге (по secure теме и NodeJS), говорится о том, что мы должны обрабатывать такие параллельные запросы?
  • Вопрос задан
  • 339 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
Robur
@Robur
Знаю больше чем это необходимо
намудрено не слишком, вместо монго можете взять что-то более подходящее, например redis. нагрузка будет небольшая, не больше чем ходить в базу за данными для запроса в обычном сценарии.
Но основной вопрос который вы должны найти в книге - зачем вообще так делать, с какой проблемой это призвано справиться. Потом посмотреть актуально ли это для вас и стоит ли оно затраченных усилий.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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