我发现上面的答案有点难以理解——它们泄漏了全局变量,有单字符变量,还有一些奇怪的命名。所以这是我自己的答案,供我(和你)参考:
使用“hbs”的动态部分,express.js 默认车把实现:
我用它来制作一个简单的博客(article-name).md
,/blog/(article-name)
创建一个动态部分:
// Create handlebars partials for each blog item
fs.readdirSync('blog').forEach(function(blogItem){
var slug = blogItem.replace('.md','')
var fileContents = fs.readFileSync('blog/'+blogItem, 'utf8')
var html = marked(fileContents)
var compiledTemplate = hbs.compile(html);
hbs.registerPartial(slug, compiledTemplate);
})
// Create 'showBlogItem' helper that acts as a dynamic partial
hbs.registerHelper('showBlogItem', function(slug, context, opts) {
var loadedPartial = hbs.handlebars.partials[slug];
return new hbs.handlebars.SafeString(loadedPartial(context));
});
这是路线。如果部分不存在,则 404s,因为博客不存在。
router.get('/blog/:slug', function(req, res){
var slug = req.param("slug")
var loadedPartial = hbs.handlebars.partials[slug];
if ( ! loadedPartial ) {
return res.status(404).json({ error: 'Article not found' })
}
res.render('blog', {
slug: slug
});
})
/views/blog.hbs
好像:
<div class="blog">
{{ showBlogItem slug }}
</div>