Я занимаюсь разработкой приложения, в котором есть база данных с возможностью поиска и приложение для управления, позволяющее пользователю редактировать базу данных.Открытая сторона использует 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();
}