Change Express view folder based on where is the file that res.render() is called

node.jsExpress

node.js Problem Overview


I would like to change the view folder of Express when I call res.render().

For example, if I call res.render(viewName) inside /folder/file.js, I would like that Express look for the view inside /folder/views.

If the file is inside /folder1/folder2/file.js, I would like that Express look for the view inside /folder1/folder2/views

Is it possible ?

node.js Solutions


Solution 1 - node.js

You can use the method set() to redefine express's default settings.

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

For a dynamic path change you can do something like this:

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

app.engine('jade', require('jade').__express);
app.set('view engine','jade');

app.customRender = function (root,name,fn) {

	var engines = app.engines;
	var cache = app.cache;

	view = cache[root+'-'+name];

	if (!view) {
		view = new (app.get('view'))(name, {
	      defaultEngine: app.get('view engine'),
	      root: root,
	      engines: engines
	    });

    	if (!view.path) {
          var err = new Error('Failed to lookup view "' + name + '" in views directory "' + root + '"');
          err.view = view;
          return fn(err);
        }

        cache[root+'-'+name] = view;
	}

    try {
      view.render(opts, fn);
    } catch (err) {
      fn(err);
    }
}

app.get('/', function(req, res) {

	app.customRender(path.join(__dirname, '/path/to/user/'),'index',function (err,html) {
		if (err)
			res.send(404);
		else
			res.send(200,html);
	});

});

app.listen(3000);

Solution 2 - node.js

Instead of simply passing your view name to the render function, you can pass a relative or​ ​absolute​​ ​path.​​​​​​

Simple example:

app.get('/your/path', function(req, res) {
    //viewname can include or omit the filename extension
    res.render(__dirname + '/folder/with/views/viewname'); 
});​​​​​​​​​​

Solution 3 - node.js

That's pretty simple

to change the view folder of Express when one calls res.render(), just set the path where the views are located, in your case,

app.set('views','./folder1/folder2/views');

This changes the path where Express would search for specified views.

Solution 4 - node.js

(Sorry I can't comment yet)

[@nuzzolilo's answer][1] works well. But if you prefer ES6

app.get('/path', function (req, res) {
    res.render(`${__dirname}/templates_dir/index`, { data: "value" });
});

This simply improves code readability ;)

[1]: https://stackoverflow.com/questions/21885377/change-express-view-folder-based-on-where-is-the-file-that-res-render-is-calle/34171560#34171560 "@nuzzolilo"

Solution 5 - node.js

You can also get the relative path by using require.resolve: res.render(require.resolve('./folder/with/views/viewname'));

Solution 6 - node.js

Set the path of view location.

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

Set the view engine.

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

Complete code will look like below.

const express = require('express');
const path = require('path');

const app = express();

app.set('views', path.join(__dirname, '/views'));
app.set('view engine','ejs');

app.listen(3000, () => console.log('Application is running on'));

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTalyssonView Question on Stackoverflow
Solution 1 - node.jsPedro NasserView Answer on Stackoverflow
Solution 2 - node.jsmarknuzzView Answer on Stackoverflow
Solution 3 - node.jsVickarView Answer on Stackoverflow
Solution 4 - node.jsCollinView Answer on Stackoverflow
Solution 5 - node.jsLuke ChinworthView Answer on Stackoverflow
Solution 6 - node.jsMiraj KhandakerView Answer on Stackoverflow