我正在关注使用ejs5的教程。那个教程要我使用express-flash,然后组织我的routes/users
页面。
router.get('/signup', function(req, res, next){
res.render('accounts/signup', {
errors: req.flash('errors')
});
});
随后的es5就是这样:
<% if (errors.length > 0) { %>
<%= errors %>
<% } %>
对于我自己,我使用的是Express-Handlebars。现在,我知道我的app.js
文件包含了所需的一切,因为我的/signup
路由工作原理如下:
router.get('/signup', function(req, res, next){
res.render('accounts/signup');
});
但是,如果我重新格式化我的路由器代码,如第一个示例所示,我的signup
路由上出现404错误。我不明白为什么会这样。为了证明,这就是我所拥有的,与第一个例子相同。
//render the signup//
router.get('/signup', function(req, res, next){
res.render('accounts/signup', {
errors: req.flash('errors')
});
});
可以肯定的是,我的主app.js文件包含以下内容:
var flash = require('express-flash');
app.use(flash());
除此之外,我还不确定如何使用Handlebars复制ejs脚本。会做这样的工作吗?
{{#if errors.length > 0}}
{{errors}}
{{/if}}
我无法测试这个,因为我首先需要显示我的注册路线。
答案 0 :(得分:1)
您可以注册Flash帮助程序并在主模板中使用它。
// set context for the req, res
app.use(require('./../web/helpers/view').setContext);
exphbs.create({
extname :'hbs',
layoutsDir : '/path/',
defaultLayout: 'main',
helpers : require('/path/to/view').helpers, // this is where you can register a helper.
partialsDir : [
'/path/'
]
});
在view.js
中,编写一个方法来构建flash消息中的html。
'use strict';
const _ = require('lodash');
let _req, _res;
// build html for flash messages.
function renderFlashMsg() {
let flash = _req.flash(),
out = '',
types = ['success', 'error', 'info'];
_.each(types, (type) => {
if (flash[type]) {
out += '<div class="flash-msgs '+ type +'">';
out += '<h2><span>' + type + '</span></h2>';
out += '<ul>';
_.each(flash[type], (msg) => {
out += `<li>${msg}</li>`;
}) ;
out += '</ul></div>';
}
});
return out;
}
module.exports = {
'setContext': (req, res, next) => {
_req = req;
_res = res;
next();
},
'helpers': {
renderFlashMsg
}
};
现在,您可以在renderFlashMsg
布局文件中使用main
。
将{{{renderFlashMsg}}}
放在您希望将Flash消息放入DOM的位置。
答案 1 :(得分:1)
您是否为车把模板设置了视图引擎?
app.engine('handlebars', exphbs({/* config */}));
app.set('view engine', 'handlebars');
或将文件扩展名更改为.handlebars