Vaibhav K
Vaibhav K

Reputation: 842

How to render Swig templates with Express 4?

I am not able to use Swig templates with Express for Node. I get the following error :

Error: Failed to lookup view "index" in views directory

The Swig templates are not being compiled into .html files

My code is below :

var express = require('express');
var cons = require('consolidate');
var swig = require('swig');
var app = express();

//Set template engine
app.engine('html', cons.swig);
app.set('view engine', 'html');
app.set('views', __dirname + '/views')


// Disable Express's and Swig Cache
app.set('view cache', false);
swig.setDefaults({ cache: false });

app.get('/', function(req, res){
  res.render('index', {'title': 'Design'});
});

app.listen(3000);

Upvotes: 4

Views: 3123

Answers (4)

vaibhav.thechamp
vaibhav.thechamp

Reputation: 1

for latest version of swig we need to include swig package which needed to installed through package manager or package.json file

var express = require('express');

var swig = require('swig');

var app = express();

// Here we need to set up and engine as per latest version of swig //for latest version of swig we need to include swig package which //needed to installed through package manager or package.json file

app.engine('swig', swig.renderFile);

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

app.set('views', path.join(__dirname, 'views'));

app.set('view cache', false);

swig.setDefaults({ cache: false }); //Here we are setting cache defaults to false.

`

Upvotes: 0

edesilets
edesilets

Reputation: 180

I just had the same issue. In order to use swig templates with the swig extension working you can follow the swig Docs and then replace the two following lines with app.engine('html', cons.swig); app.set('view engine', 'html'); with app.engine('swig',swig.renderFile); app.set('view engine', 'html');

Should look something like this.

var express = require('express');
var swig = require('swig');
var app = express();

// view engine setup
// This is where all the magic happens!
app.engine('swig', swig.renderFile);
app.set('view engine', 'swig');
app.set('views', path.join(__dirname, 'views'));
app.set('view cache', false);
swig.setDefaults({ cache: false });

Expressjs 4.x docs app.engine The app.engine takes a extension and a callback. So to all files found with the swig extension have a callback of swig.renderFile. Each file with generated to HTML.

Expressjs 4.x docs app.set Setting the view engineto swig is setting the default engine extension to use when omitted. Were also saying that all the views can be found in the /blaha/blaha/blah/views directory.

NOTE: All files in the views directory must end int .swig. So just a friendly reminder make sure when you "include" or reference another template you must put the filename and extension it the path. ex: layout.swig. I hope this gets your project working.

Upvotes: 3

saike
saike

Reputation: 1046

Yes, i think it's more semantic to store your templates as .swig files, if you using SWIG as template engine. So, all you need is set 'swig' as engine:

// view engine setup
app.engine('swig', swig.renderFile);
app.set('view engine', 'swig');
app.set('views', path.join(__dirname, 'views'));

Then you can store your views like ./views/layout.swig

Upvotes: 0

Jake Wilson
Jake Wilson

Reputation: 91193

As explained here:

http://mherman.org/blog/2015/08/23/primer-on-swig-templating/#.VhWxVvlVhBc

Simply use .html files instead of .swig files. I don't know where you got the idea of using .swig files. Maybe an older version? I dunno. The current Swig's documentation Basic Usage shows using a .html file as well:

http://paularmstrong.github.io/swig/docs/

If you rename your index.swig to index.html I would expect it to work fine.

Upvotes: 2

Related Questions