Javascript - Flash-сообщения не отображаются при вызовах AJAX - PullRequest
0 голосов
/ 02 октября 2018

Я занимаюсь разработкой приложения, в котором есть база данных с возможностью поиска и приложение для управления, позволяющее пользователю редактировать базу данных.Открытая сторона использует Knockout JS, взаимодействующий с сервером через RESTful API.Администрация приложения использует экспресс.Страницы визуализируются из шаблонов с использованием Handlebars.В представлении редактирования используется тот же код рендеринга, что и в общедоступном представлении.

Я использую connect-flash для отправки сообщений с результатами действий в редакторы.Когда форма отправляется на страницу (используется для добавления новой ссылки), флеш-сообщения отображаются, как и ожидалось, однако для команд, доступных для каждого элемента в табличном представлении (например, для удаления конкретной ссылки), я используювызов ajax из функции, определенной в модели представления.Вызов выполняется правильно, и действие выполняется, но флэш-сообщение никогда не отображается пользователю.У меня есть специальное промежуточное программное обеспечение, которое собирает флэш-сообщения в объект замены для шаблонов.Когда я регистрирую, какие сообщения отправлены, я никогда не вижу сообщение, полученное в результате вызова удаления, поэтому я не просто теряю его при дополнительном обновлении.

Вот обработчик запроса, который я использую:

var router = express.Router();
var client = solr.createClient(...);

router.get('/', function (req, res, next) {
    res.render('refs', req.replacements);
});

// This one is submitted via an html form post, and works
router.post('/new', function (req, res, next) {

    var doc = {};

    ... // Form reading and validation code

    client.add(doc, { commitWithin: 50 }, function (err, data) {

        if (err) {
            console.log(err);
            req.flash('error', 'A problem occurred during submit.'); //works
        } else { // Success            
            req.flash('yay', 'New reference successfully added.'); //works
        }

        res.redirect(303, '/refs?rows=1&q=id%3A' + newId);
    });
});

// This one is submitted via ajax in the view model. Action works, flash doesn't
router.delete("/:id(\\d+)", function (req, res, next) {

    var id = req.params.id;
    var query = 'q=id:' + id;


    var doc = undefined;
    client.get('refs', query, function (err, obj) {
        if (err) {
            req.flash('error', 'Unable to obtain a copy of object to delete for audit log. Reference not deleted.');
            res.redirect(303, '/refs');
        } else {
            doc = obj.response.docs[0];

            client.deleteByID(id, { commitWithin: 50 }, function (err, data) {
                if (err) {
                    console.log(err);
                    return req.flash('error', 'A problem occurred during delete submission.');
                } else { // Success
                    req.flash('yay', 'Reference successfully deleted.'); // Never seen
                }
            });
        }
    });

    res.redirect(303, url.format({
        pathname:"/refs",
        query:req.query,
    }));
});

Я попытался изменить перенаправление на 278, чтобы запретить браузеру прозрачно обрабатывать перенаправление, а затем обрабатывать его в функции успеха вызова ajax, согласно Как управлять запросом на перенаправление после jQueryВызов Ajax , но это не помогло.

Вот JavaScript-код на стороне клиента, который определяет модель представления:

function RefsViewModel(qString) {
    "use strict";
    var self = this;
    self.refs = ko.observableArray();

    $.ajax({
        // This makes the call which populates self.refs with observables
    });

    self.deleteRef = function (ref) {
        $.ajax({ // Makes an AJAX query to the server for the source
            url: "/refs/" + ref.id(),
            type: "DELETE",
            error: function (jqXHR) {
                console.log("ajax error " + jqXHR.status);
                alert("Error sending delete request");
            }
        });
    }
}

И промежуточное программное обеспечение, которое я использую для сборафлеш-сообщения:

var flash = require('connect-flash');
function flashMessageCenter(req, res, next) {
    if(typeof req.replacements === "undefined") {
        req.replacements = {}
    }

    req.replacements.errorMessage = req.flash("error");
    req.replacements.yayMessage = req.flash("yay");
    req.replacements.infoMessage = req.flash("info");
    console.log(req.replacements);

    return next();
}
...