Change Express view folder based on where is the file that res.render() is called
node.jsExpressnode.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'));