UNPKG

2.44 kBJavaScriptView Raw
1// npm install express express-hbs
2
3'use strict';
4
5var express = require('express');
6var app = express();
7var hbs = require('..'); // should be `require('express-hbs')` outside of this example
8var fs = require('fs');
9var fp = require('path');
10
11function relative(path) {
12 return fp.join(__dirname, path);
13}
14var viewsDir = relative('views');
15
16app.use(express.static(relative('public')));
17
18// Hook in express-hbs and tell it where known directories reside
19app.engine('hbs', hbs.express4({
20 partialsDir: [relative('views/partials'), relative('views/partials-other')],
21 layoutsDir: relative('views/layout'),
22 defaultLayout: relative('views/layout/default.hbs')
23}));
24app.set('view engine', 'hbs');
25app.set('views', relative('views'));
26
27
28// Register sync helper
29hbs.registerHelper('link', function(text, options) {
30 var attrs = [];
31 for (var prop in options.hash) {
32 attrs.push(prop + '="' + options.hash[prop] + '"');
33 }
34 return new hbs.SafeString('<a ' + attrs.join(' ') + '>' + text + '</a>');
35});
36
37// Register Async helpers
38hbs.registerAsyncHelper('readFile', function(filename, cb) {
39 fs.readFile(fp.join(viewsDir, filename), 'utf8', function(err, content) {
40 if (err) console.error(err);
41 cb(new hbs.SafeString(content));
42 });
43});
44
45var fruits = [
46 {name: 'apple'},
47 {name: 'orange'},
48 {name: 'pear'}
49];
50
51
52var veggies = [
53 {name: 'asparagus'},
54 {name: 'carrot'},
55 {name: 'spinach'}
56];
57
58app.get('/', function(req, res) {
59 res.render('index', {
60 title: 'express-hbs example'
61 });
62});
63
64app.get('/fruits', function(req, res) {
65 res.render('fruits/index-layoutsDir', {
66 title: 'My favorite fruits',
67 fruits: fruits
68 });
69});
70
71app.get('/fruits/:name', function(req, res) {
72 res.render('fruits/details-layoutsDir', {
73 fruit: req.params.name
74 });
75});
76
77app.get('/veggies', function(req, res) {
78 res.render('veggies', {
79 title: 'My favorite veggies',
80 veggies: veggies,
81 layout: 'veggie'
82 });
83});
84
85app.get('/veggies/explicit-dir', function(req, res) {
86 res.render('veggies', {
87 title: 'My favorite veggies',
88 veggies: veggies,
89 layout: relative('views/layout/veggie')
90 });
91});
92
93app.get('/veggies/:name', function(req, res) {
94 res.render('veggies/details', {
95 veggie: req.params.name,
96 layout: 'veggie-details'
97 });
98});
99
100if (require.main === module) {
101 app.listen(3000);
102 console.log('Express server listening on port 3000');
103} else {
104 module.exports = app;
105}