1

i have just set up my layouts folder inside view as

app.engine('hbs', hbs({extname: 'hbs', defualtLayout : 'layout' , layoutDir: __dirname + '/views/layouts'}));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');

module use is

var hbs = require('hbs');

which give me th following errors

app.engine('hbs', hbs({extname: 'hbs', defualtLayout : 'layout' , layoutDir: __dirname + '/views/layouts'}));
                  ^

TypeError: hbs is not a function
Anis
  • 1,190
  • 2
  • 13
  • 26

6 Answers6

4

This worked for me.

make sure install this package: npm install express-handlebars

var hbs = require('express-handlebars');

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');
app.engine('hbs', hbs.engine({
  extname: 'hbs',
  defaultLayout: 'layout',
  layoutsDir: __dirname + '/views/layout/',
  partialsDir: __dirname + '/views/partials'
}))
muzu-85
  • 51
  • 2
2

Because what exported by hbs module is not a function actually.

You should read the description file of the hbs module and it has tell you how to use it.

Using hbs as the default view engine requires just one line of code in your app setup. This will render .hbs files when res.render is called.

app.set('view engine', 'hbs');

To use a different extension (i.e. html) for your template files:

app.set('view engine', 'html');

app.engine('html', require('hbs').__express);

and another way is using express-handlebars module, it could be used on your way.

app.engine('handlebars', exphbs({defaultLayout: 'main'}));

app.set('view engine', 'handlebars');
WangJie
  • 334
  • 1
  • 7
2

Use hbs.engine() like given below

app.engine('hbs', hbs.engine({
    extname: 'hbs',
    defaultLayout: 'layout',
    layoutDir: __dirname + '/views/layouts'
}));
Tyler2P
  • 2,324
  • 26
  • 22
  • 31
0

Its working as i change module to

var hbs = require('express-handlebars');
Anis
  • 1,190
  • 2
  • 13
  • 26
0

The below code works fine for me.

app.engine(
    'hbs',
    expressHbs.engine({
      layoutsDir: 'views/layouts/',
      defaultLayout: 'main-layout',
      extname: 'hbs'
}));

enter image description here

Nakul Nagariya
  • 97
  • 1
  • 1
  • 8
-1
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');
app.engine('hbs',hbs.engine({extname:'hbs',defaultLayout:'layout',layoutsDir:__dirname+'/views/layout/',partialDir:__dirname+'/views/partials/'}))

change hbs to hbs.engine

pumbo
  • 3,646
  • 2
  • 25
  • 27
Akki
  • 1