UNPKG

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