флеш-сообщения не сохраняются до отображения страницы (узел) - PullRequest
0 голосов
/ 24 ноября 2018

Как часть общего маршрута get в экспресс-приложении, я хочу отправить два флеш-сообщения с помощью express-session и connect-flash.Это все работает, за исключением того, что req.flash не сохраняет до отображения страницы.В результате флэш-сообщения не отображаются до тех пор, пока пользователь не загрузит другую страницу или эту же страницу снова.

Код последней функции в маршруте:

    Post.countDocuments().exec(function(err, count){
        if(err) {
            console.log(err);
            res.redirect("back");
        }

        req.flash("success", ["It's working", "Hallelujah!"]);
        req.flash("error", ["Uh oh!", "We have a problem..."]);

        res.render("index", {posts: allPosts, dates: dates, current: pageNumber, pages: Math.ceil(count / pageLimit), showing: showing, total: count});
    });

и воткод для одного из шаблонов флеш-сообщений (ejs):

    <div class="flash flash-success">
        <div class="flash-header">
            <span class="flash-title flash-title-success"><i class="fas fa-check"></i> <%= success[0] %></span>
            <span class="flash-close" onclick="return closeFlash(this);"><i class="fas fa-times"></i></span>
        </div>

        <hr class="flash-hr">
        <div class="flash-body-success"><%= success[1] %></div>
    </div>

Я пытался использовать .exec () после req.flash, чтобы оператор рендеринга выполнялся по завершении, но это не сработало, и я 'Мы также пробовали req.session.save () с оператором рендеринга в обратном вызове, но это также не удалось.

Проблема не решается ни избавлением от одного из операторов req.flash, ни передачей только одного строкового аргумента вместо массива из двух.

1 Ответ

0 голосов
/ 25 ноября 2018

Проблема заключалась в том, что у меня было

app.use(function(req, res, next) {
    res.locals.currentUser = req.user;
    res.locals.error = req.flash("error);
    res.locals.success = req.flash("success");
    return next();
});

в app.js, и поэтому это промежуточное программное обеспечение было запущено до того, как маршрут смог установить значения для req.flash, означая, что ошибка и успех были установлены как пустые.

Я решил эту проблему, создав функцию сохранения req.flash в res.locals непосредственно перед рендерингом страницы:

var toolsObj = {};

toolsObj.saveFlash = function(req, res) {
    res.locals.error = req.flash("error");
    res.locals.success = req.flash("success");
};

module.exports = toolsObj;
...