1
npm install express-handlebars
1
2
3
4
5
6
7
const express = require('express');
const exphbs = require('express-handlebars');
const app = express();
app.engine('hbs', exphbs.engine({ extname: '.hbs' }));
app.set('view engine', 'hbs');
app.set('views', './views');
├── layouts/
│ └── main.hbs
├── home.hbs
├── product-list.hbs
├── product-detail.hbs
├── login.hbs
└── register.hbs
views/layouts/main.hbs:
routes/pages.js
(create new):1
2
3
4
5
6
7
8
9
10
11
12
13
const express = require('express');
const router = express.Router();
const Product = require('../models/Product');
router.get('/', async (req, res) => {
const products = await Product.find();
res.render('home', {
title: 'Home',
products
});
});
module.exports = router;
app.js
:1
2
const pageRoutes = require('./routes/pages');
app.use('/', pageRoutes);
views/home.hbs
:routes/pages.js
:1
2
3
4
5
6
7
router.get('/product/:id', async (req, res) => {
const product = await Product.findById(req.params.id);
res.render('product-detail', {
title: product.name,
product
});
});
views/product-detail.hbs
:1
2
3
4
5
6
7
router.get('/login', (req, res) => {
res.render('login', { title: 'Login' });
});
router.get('/register', (req, res) => {
res.render('register', { title: 'Register' });
});
views/login.hbs
:Notes
- Use res.render(viewName, data) to pass dynamic content.
- You can add conditional views (e.g. show/hide buttons) using if in Handlebars.
- For partials and reusability, register partials in Handlebars config.