Я использую экспресс для создания веб-приложения в node.js. Это упрощение того, что у меня есть:
var express = require('express');
var jade = require('jade');
var http = require("http");
var app = express();
var server = http.createServer(app);
app.get('/', function(req, res) {
// Prepare the context
res.render('home.jade', context);
});
app.post('/category', function(req, res) {
// Process the data received in req.body
res.redirect('/');
});
Моя проблема заключается в следующем:
Если я обнаружу, что отправленные данные /category
не проверяются, я хотел бы передать дополнительный контекст на /
страницу. Как я мог это сделать? Redirect, кажется, не допускает каких-либо дополнительных параметров.
flash
: stackoverflow.com/questions/12442716/…/
страницы. Существует/
маршрут, который экспресс может обслуживать, и есть шаблон домашней страницы, который экспресс может отображать. Если вы хотите сохранить некоторые данные для рендеринга шаблона домашней страницы после перенаправления, несмотря на принятый ответ, сеансы - ваш друг. Они предоставляют вам хранилище данных, которое сохраняется между запросами и ответами для отдельных пользователей, просматривающих данные, так что вы можете поместить данные во время/category
обработки, а затем извлечь их, если они есть во время/
передачи.Ответы:
Есть несколько способов передачи данных по разным маршрутам. Самый правильный ответ - это, конечно, строки запроса. Вы должны убедиться , что значения правильно encodeURIComponent и decodeURIComponent .
Вы можете поймать это в вашем другом маршруте, получая параметры, отправленные с помощью
req.query
.Для более динамичного способа вы можете использовать
url
основной модуль для генерации строки запроса для вас:Поэтому, если вы хотите перенаправить все переменные строки запроса req, вы можете просто сделать
И если вы используете Node> = 7.x, вы также можете использовать
querystring
основной модульДругой способ сделать это - настроить что-то в сеансе. Вы можете прочитать, как установить его здесь , но установить и получить доступ к переменным это примерно так:
А потом после перенаправления ...
Существует также возможность использования старой функции Express
req.flash
. Для этого в более новых версиях Express вам потребуется использовать другую библиотеку. По сути, это позволяет вам устанавливать переменные, которые будут отображаться и сбрасываться при следующем входе на страницу. Он удобен для отображения ошибок пользователям, но опять же он был удален по умолчанию. РЕДАКТИРОВАТЬ: Найдена библиотека, которая добавляет эту функциональность.Надеюсь, это даст вам общее представление о том, как передавать информацию в приложении Express.
источник
/
маршрут. Другой вариант - вызвать почтовый маршрут через AJAX и сохранить полученные данные в локальном хранилище или в чем-то подобном.Я нашел самый простой способ передачи данных между routeHandlers, чтобы
next()
не было необходимости связываться с редиректом или сессиями. При желании вы могли бы просто назвать своюhomeCtrl(req,res)
вместоnext()
и просто пройтиreq
иres
источник
/
Мне пришлось искать другое решение, потому что ни одно из предложенных решений не соответствовало моим требованиям по следующим причинам:
Строки запроса . Возможно, вы не захотите использовать строки запроса, поскольку URL-адреса могут совместно использоваться вашими пользователями, а иногда параметры запроса не имеют смысла для другого пользователя. Например, ошибка, такая как
?error=sessionExpired
никогда не должна отображаться другому пользователю случайно.req.session : вы можете не использовать,
req.session
потому что для этого вам нужна зависимость экспресс-сессии , которая включает в себя настройку хранилища сеансов (например, MongoDB), которое вам может вообще не понадобиться, или, возможно, вы уже используете пользовательский решение для магазина сессий.next () : вы, возможно, не захотите использовать
next()
илиnext("router")
потому, что по сути это просто отображает вашу новую страницу под исходным URL-адресом, на самом деле это не перенаправление на новый URL-адрес, а скорее переадресация / перезапись, что может быть неприемлемо.Так что это мое четвертое решение, которое не страдает ни от одной из предыдущих проблем. В основном это связано с использованием временного куки-файла, для которого вам сначала нужно будет установить cookie-парсер . Очевидно, это означает, что он будет работать только там, где включены файлы cookie и с ограниченным объемом данных.
Пример реализации:
источник
express-session
. База данных просто сохраняет сеансы при перезапусках сервера.использовать app.set & app.get
Настройка данных
Получение данных
источник
Вот то, что я предлагаю без использования какой-либо другой зависимости, просто узел и экспресс, используйте app.locals, вот пример:
источник
Вы можете передать небольшие биты данных пары ключ / значение через строку запроса:
И javascript на домашней странице может получить к нему доступ и соответствующим образом изменить свое поведение.
Обратите внимание, что если вы не возражаете против
/category
сохранения URL-адреса в адресной строке браузера, вы можете просто выполнить рендеринг напрямую, а не перенаправлять. ИМХО, много раз люди используют перенаправления, потому что старые веб-фреймворки затрудняют прямой ответ, но в экспрессе это легко:Как прокомментировал @ Dropped.on.Caprica, использование AJAX устраняет проблему изменения URL.
источник
мы можем использовать экспресс-сессию для отправки необходимых данных
когда вы инициализируете приложение
поэтому перед перенаправлением просто сохраните контекст для сеанса
Теперь вы можете получить контекст где угодно для сеанса. это можно получить только путем req.session.context
источник