В Express рекомендуется ли использовать req.session
для передачи данных между маршрутами?
Нет, не совсем.
Объект сеанса для хранения состояния для пользователя, к которому может потребоваться регулярный доступ по многим маршрутам, таким как его имя, состояние входа в систему и т. д. c ... Обычно оно не используется для отправки временного состояния с одного маршрута на другой.
Если вы пытаетесь установить множитель на одном маршруте, а затем использовать этот множитель на другом маршруте, это своего рода нарушение модели REST для страниц с самоописанием, которые не зависят от каких-то маги c последовательность событий, происходящих до попадания этого URL. Например, если пользователь добавляет в закладки ваш маршрут /multiplier
, он может получать разные результаты каждый раз, когда он go там. Это не совсем то, как следует использовать сессию. Его можно использовать таким образом, но для показанного вами примера, если значение множителя не было больше похоже на предпочтение пользователя, которое предназначено для применения ко многим страницам и сохраняется в течение длительного времени (а это не так, поскольку вы используя его, затем удаляя его), тогда не имеет смысла помещать это в сеанс. Он нарушает возможности REST URL-адреса /multiplier
, потому что он отображает что-то другое или ошибку в зависимости от того, что было до него. Это не концепция REST.
Концепция REST заключается в том, чтобы поместить множитель в параметр запроса для URL:
/multiplier?value=10;
Тогда любой, кто отображает страницу, может просто получить это значение. из параметра запроса, а URL-адрес является самоописываемым, автономным, работает для закладки, работает правильно, даже если открыто несколько windows, не имеет условий гонки и соответствует философии дизайна REST.
app.get('/multiplier', function(req, res, next) {
let clientData = +(req.query.value || 1);
let output = clientData * 100;
res.send(output);
});
В новом примере, который вы добавили к своему вопросу, вы сначала делаете:
GET /
И это каким-то образом вставляет в сеанс какое-то состояние, которое затем влияет на результат:
GET /edit_user_data
Это просто не имеет никакого смысла для меня. В архитектуре REST GET должен быть идемпотентом. Это означает, что данный URL для данного GET должен каждый раз генерировать один и тот же результат. Ваше GET /edit_user_data
не так. То, что он делает, по-видимому, зависит от того, что было раньше, так что указанный c URL может каждый раз иметь разный эффект. Это НЕ идемпотент.
Вы бы использовали POST, чтобы вставить новую запись в базу данных, или PUT, чтобы изменить существующую запись в базе данных, и вы бы отправили данные вместе с запросом, а не делали это раньше. где-то в каком-то состоянии.
То, что вы пытаетесь сделать, это не архитектура REST. Есть много хороших учебников или описаний архитектуры REST. Я бы посоветовал вам прочитать несколько из них. Вот одна такая статья .