Anis
Anis

Reputation: 1219

Handles Bars hbs is not a function

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

Upvotes: 1

Views: 10833

Answers (6)

Nakul Nagariya
Nakul Nagariya

Reputation: 107

The below code works fine for me.

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

enter image description here

Upvotes: 1

Basil Sajeev
Basil Sajeev

Reputation: 21

Use hbs.engine() like given below

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

Upvotes: 2

Akki
Akki

Reputation: 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

Upvotes: -1

muzu-85
muzu-85

Reputation: 51

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'
}))

Upvotes: 4

WangJie
WangJie

Reputation: 334

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');

Upvotes: 2

Anis
Anis

Reputation: 1219

Its working as i change module to

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

Upvotes: 0

Related Questions