Express+Handlebars中如何用正则构建带数字后缀的Partial路径?
问题:Express+Handlebars随机调用指定后缀Partial失败
我用Express.js和Handlebars.js开发清单应用,用户完成清单提交后跳转至带动画的页面,动画存放在Partial文件中。我想通过生成随机数拼接字符串,调用对应数字后缀的Partial(如animation-1.hbs),但代码里的正则表达式导致路径出现//.*/错误内容,无法正确加载Partial。
路由代码(checklist.js)
router.get('/bedtime-checklist-complete', (req, res, next) => { let number = Math.round(Math.random() * 2); res.locals.selection = 'animations/' + /.*/ + number; res.render('checklists/bedtime-checklist-complete', { pageTitle: "Checklist complete!", bodyClass: "checklist-complete" }); })
模板代码(bedtime-checklist-complete.hbs)
<main> <h1>Great work!</h1> <div id="imgContainer"> {{> (lookup . 'selection') }} </div> </main>
解决方法
核心问题是你错误使用了正则表达式字面量/.*/——在JavaScript中直接拼接正则字面量会被转为字符串"/.*/",这完全不符合需求。你根本不需要正则,直接拼接前缀和随机数即可:
修正后的路由代码
router.get('/bedtime-checklist-complete', (req, res, next) => { // 生成0-2的随机整数(根据实际Partial数量调整范围) let number = Math.round(Math.random() * 2); // 直接拼接Partial路径,对应animations/animation-0.hbs这类文件 res.locals.selection = `animations/animation-${number}`; res.render('checklists/bedtime-checklist-complete', { pageTitle: "Checklist complete!", bodyClass: "checklist-complete" }); })
关键说明
- 假设你的Partial文件命名为
animations/animation-0.hbs、animations/animation-1.hbs、animations/animation-2.hbs,上述代码会随机生成这三个路径之一,Handlebars能正确加载对应的Partial。 - 若你的Partial前缀不是
animation-,替换为实际前缀即可(比如anim/foo-${number})。 - 模板中的
{{> (lookup . 'selection') }}写法没问题,只要selection是正确的Partial路径字符串就能生效。 - 若后续增加Partial数量,只需调整
Math.random() * X中的X值(比如5个Partial就写*4,生成0-4的随机数)。
内容的提问来源于stack exchange,提问作者kdub1312
相关产品推荐
相关产品推荐

