Node.js新手求教:MongoDB数据展示转Handlebars及模板引擎对比
嘿,作为Node.js新手刚上手Handlebars,这几个问题我当年入门的时候也琢磨过,咱们一步步来解决!
1. EJS代码转Handlebars代码
先把你给出的原EJS代码贴出来:
<% if(files){ %>
<% files.forEach(function(file) { %>
<% if(file.isImage) { %>
<% } else { %>
<%= file.filename %>
<% } %>
<% }) %>
<% } %>
对应的Handlebars代码如下,语法更简洁直观:
{{#if files}} {{#each files as |file|}} <div class="card card-body mb-3"> {{#if file.isImage}} <img src="image/{{file.filename}}" alt=""> {{else}} {{file.filename}} {{/if}} </div> {{/each}} {{/if}}
简单解释下差异:
- Handlebars用块级表达式处理条件和循环:
{{#if}}对应EJS的<% if() %>,{{#each}}替代forEach循环 - 变量输出直接用
{{变量名}},不需要EJS的<%= %>语法 - 每个块级标签都需要闭合(比如
{{/if}}、{{/each}}),结构更清晰
2. 展示MongoDB数据时切换到Handlebars
切换步骤很清晰,咱们一步步来:
- 第一步:安装依赖
在项目根目录运行命令:npm install express-handlebars - 第二步:配置Express使用Handlebars
在你的Express入口文件(比如app.js)里添加配置:const express = require('express'); const exphbs = require('express-handlebars'); const app = express(); // 注册Handlebars引擎 app.engine('handlebars', exphbs.engine()); // 设置视图引擎为Handlebars app.set('view engine', 'handlebars'); // 指定模板文件存放目录(默认是项目根目录下的views文件夹) app.set('views', './views'); - 第三步:从MongoDB取数并渲染模板
假设你用Mongoose操作MongoDB,先定义好数据模型,然后在路由里查询数据并传给模板:// 假设你的File模型定义在models/File.js const File = require('./models/File'); app.get('/files', async (req, res) => { try { // 从MongoDB查询所有文件数据 const files = await File.find(); // 渲染views目录下的files.handlebars模板,传入files数据 res.render('files', { files }); } catch (err) { console.error('获取数据失败:', err); res.status(500).send('服务器出错啦'); } }); - 第四步:准备Handlebars模板
在views目录下创建files.handlebars文件,把第一部分写的Handlebars代码放进去就行。
3. EJS与Handlebars哪个更适用?
这个得看你的场景和习惯:
- 选EJS的情况:
- 你刚接触模板引擎,想快速上手,EJS语法和JavaScript几乎无缝衔接,学习成本极低
- 项目很小,需要快速开发,不在意模板里写少量JS逻辑
- 你喜欢灵活的写法,比如在模板里直接写循环判断、临时变量
- 选Handlebars的情况:
- 你想保持模板的干净,把业务逻辑都放在后端控制器里(符合MVC思想)
- 团队协作开发,需要统一的模板规范,避免有人在模板里写复杂逻辑导致维护困难
- 项目规模较大,需要复用一些常用的渲染逻辑(Handlebars支持自定义Helper,比如格式化日期、处理数组)
简单总结:EJS灵活自由,适合小项目和新手快速试错;Handlebars规范约束,适合中大型项目和团队协作。
内容的提问来源于stack exchange,提问作者Abhishek Konnur
相关产品推荐
相关产品推荐

