Jade HTML не обновляется после перенаправления в Express.js
В настоящее время у меня возникают проблемы с отображением флеш-сообщения в Express.js
используя шаблонный движок Джейд и подключи вспышку. Я просто пытаюсь прошить сообщение об ошибке, когда пользователь пытается добавить новый объект User в мою базу данных, которая уже существует. Однако флэш-сообщение не появляется на моей странице после вызова router.post и перенаправления обратно на индекс (код ниже).
С помощью различных console.logs и отладки я обнаружил, что данные, которые я публикую, действительно публикуются правильно, и флэш-сообщение устанавливается. Я обнаружил, что при перенаправлении все правильные данные передаются в шаблон Jade, но переменные не обновляются в самом файле. Теперь мне интересно, если это проблема, связанная с сеансом, или просто что-то связанное с Flash/Jade/Express, которое я полностью пропускаю?
В приведенном ниже коде я записываю данные сеанса, а также устанавливаю флэш-сообщение в переменную. Если массив для сообщения (ов) флэш-памяти является пустым (т.е. при загрузке страницы), массив устанавливается с сообщением, которое говорит об этом. Если массив флеш-сообщений содержит флэш-сообщение, то для тестового массива устанавливается сообщение, в котором говорится об этом.
index.js
:
router.get('/', function(req, res, next) {
console.log(req.session);
var testArray;
var errorMessages = req.flash('user-error');
if (errorMessages.length === 0)
testArray = ['errorMessages is empty'];
else
testArray = ['errorMessages contains a message now'];
console.log(errorMessages);
console.log(testArray);
res.render('index', {
message: errorMessages,
tester: testArray,
...other irrelevant vars being passed...
});
});
router.post('/add', function(req, res, next) {
var ajaxData = req.body;
console.log(ajaxData);
User.findOne({name: ajaxData.name}, function(err, user) {
if (err) return console.error(err);
// if User DNE already in DB
if (user === null) {
...new user created and saved here...
}
/*where the important stuff begins*/
else {
console.log("flash message set");
req.flash('user-error', "A user with that name already exists!");
}
// redirect to index
res.redirect('/');
});
});
В моем шаблоне Jade я снова записываю errorMessages и testArray, чтобы убедиться, что все правильно передано в файл, а затем показаны переменные.
index.jade
-console.log(message);
-console.log(tester);
.error-box Error: #{message}
.error-box Error: #{tester}
Первоначально загружая страницу, я получу следующий вывод HTML:
<div class="error-box">Error: </div>
<div class="error-box">Error: errorMessages is empty</div>
Здесь нет сюрпризов. Но когда я отправляю форму с данными, которые устанавливают сообщение об ошибке, я получаю обновленные журналы от router.get('/')
а также index.jade
с обоими правильными errorMessages
а также testArray
переменные. Однако мой вывод HTML остается прежним:
<div class="error-box">Error: </div>
<div class="error-box">Error: errorMessages is empty</div>
Очевидно, что переменные, передаваемые в Jade, корректно обновляются, но кажется, что Jade просто не обновляет HTML. С моим несколько ограниченным знанием того, как работают connect-flash и Jade, я могу поверить, что это проблема, связанная с сеансом, однако мой код в app.js
кажется, настроен правильно...
var session = require('express-session');
var flash = require('connect-flash');
app.use(session({
secret: 'secret',
cookie: { maxAge: 60000 },
resave: false,
saveUninitialized: false
}));
app.use(flash());
Я относительно новичок в Express.js
Я чувствую, что может быть что-то маленькое, что я пропускаю или не понимаю, но я старался быть как можно более подробным, поэтому я надеюсь, что кто-то может мне здесь помочь!
1 ответ
После более тщательного осмотра я обнаружил, что причина res.redirect('/')
не работал, так как я пытался использовать AJAX на стороне клиента для вызова router.post('/add')
,
Я решил эту проблему, просто удалив мой запрос AJAX, затем вернувшись в свой HTML и изменив атрибуты моей формы (форму, данные которой я отправлял через AJAX), чтобы включить method="POST"
а также action="/add"
, Это правильный способ позвонить на мой сервер. router.post('/add')
,
Я обнаружил, что у кого-то здесь возникла такая же проблема, и этот вопрос изначально заставил меня взглянуть на проблему AJAX/ сторона клиента и сторона сервера. Последний вопрос я нашел в комментарии @herbyme к этому сообщению.