Алекс Юнг работал над учебником по использованию флеш-сообщений . Согласно этому руководству, можно переопределить форматирование флэш-сообщений по умолчанию с помощью dynamicHelpers. К сожалению, нет подробной информации о том, что происходит, и нет возможности оставлять комментарии на странице учебника, чтобы задать соответствующие вопросы.
Чего я не вижу, так это связи между вызовом req.flash () в файле 'app.js' и объектом FlashMessage, экспортированным в файл 'helpers.js'. Зачем регулярный вызов req.flash (), который является стандартной функцией в express.js, ссылается на этот прототип FlashMessage? Я не вижу, как это происходит, когда я смотрю на код.
Сначала я подумал, что объект FlashMessage мог быть предоставлен req.flash () с помощью express.js, и в этом случае мы просто расширяем или переопределяем его в нашем вспомогательном файле. Проблема в том, что я не могу найти ссылку на FlashMessage в исходном коде express.js.
Буду очень признателен, если кто-нибудь сможет мне это объяснить.
Флэш-сообщение устанавливается в файле 'apps.js' путем вызова:
req.flash('info', 'Document created.');
Объект FlashMessage экспортируется в «helpers.js»:
FlashMessage.prototype = {
// Get css definition string for icon.
get icon() {
switch (this.type) {
case 'info':
return 'ui-icon-info';
case 'error':
return 'ui-icon-alert';
}
},
// Get css class for message container.
get stateClass() {
switch (this.type) {
case 'info':
return 'ui-state-highlight';
case 'error':
return 'ui-state-error';
}
},
// Returns HTML formatted message.
toHTML: function() {
return '<div class="ui-widget flash">' +
'<div class="' + this.stateClass + ' ui-corner-all">' +
'<p><span class="ui-icon ' + this.icon + '"></span>' + this.messages.join(', ') + '</p>' +
'</div>' +
'</div>';
}
};
exports.dynamicHelpers = {
flashMessages: function(req, res) {
var html = '';
['error', 'info'].forEach(function(type) {
var messages = req.flash(type);
if (messages.length > 0) {
html += new FlashMessage(type, messages).toHTML();
}
});
return html;
}
};
В файле app.js полная функция маршрутизации, которая вызывает req.flash, выглядит следующим образом:
// Attach dynamicHelpers to app.
app.dynamicHelpers(require('./helpers.js').dynamicHelpers);
// Routing function which calls req.flash.
app.post('/documents', loadUser, function(req, res) {
// Create Document object and assign value.
console.log('Document content: %s', req.body['document']);
var document = new Document(req.body['document']);
document.save(function() {
// Redirect to another page.
req.flash('info', 'Document created.');
res.redirect('/documents');
}
});
});