如何使用dynamic助手重写express.js中的Flash消息?

我一直在通过Alex Young关于使用Flash消息的教程。 根据本教程,可以使用dynamicHelpers覆盖默认的Flash消息格式。 遗憾的是,目前还没有关于发生的事情的详细信息,也不可能在教程页面发表任何评论以提出相关问题。

我没有看到的是调用文件'app.js'中的req.flash()和文件'helpers.js'中导出的FlashMessage对象之间的关系。 为什么在express.js中定期调用req.flash()(这是一个标准函数),首先链接到此FlashMessage原型? 当我看代码时,我看不到这是怎么回事。

起初我以为FlashMessage对象可能已经被express.js提供给req.flash(),在这种情况下,我们只是在我们的帮助文件中扩展或覆盖它。 这个问题是我无法在express.js的源代码中find对FlashMessage的任何引用。

如果有人能向我解释,我会很感激。

Flash文件通过调用以下命令设置在文件“apps.js”中:

req.flash('info', 'Document created.'); 

FlashMessage obect被导出为'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的完整路由function如下:

 // 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'); } }); }); 

这里有两个不同的东西:

a)req.flash()是由Express自己实现的 – 不是由你来实现的,你只是使用了这个函数
b)你的助手:

从快速指南:

dynamic视图助手只是接受req,res和在渲染视图之前对服务器实例进行评估的函数。 这个函数的返回值成为它所关联的局部variables。

 app.dynamicHelpers({ session: function(req, res){ return req.session; } }); 

让我们把它翻译成你的代码:

 // Attach dynamicHelpers to app. app.dynamicHelpers(require('./helpers.js').dynamicHelpers); 

这意味着,当您在视图代码中调用variablesflashMessages时,您将获得定义的那些Flashvariables的html表示forms。

所以这里最重要的是考虑你只使用req.flash(),而不是实现它。 你正在实现一个使用该function的助手。