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 к этому сообщению.

Другие вопросы по тегам