Changer le dossier de vue Express en fonction de l’emplacement du fichier appelé res.render ()

Je voudrais changer le dossier de vue d’Express quand j’appelle res.render ().

Par exemple, si j’appelle res.render (viewName) dans /folder/file.js, j’aimerais que Express recherche la vue dans / folder / views.

Si le fichier se trouve dans /folder1/folder2/file.js, j’aimerais que Express recherche la vue dans / folder1 / folder2 / views

C’est possible ?

Vous pouvez utiliser la méthode set() pour redéfinir les parameters par défaut d’Express.

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

Pour un changement de chemin dynamic, vous pouvez faire quelque chose comme ceci:

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

Au lieu de simplement passer votre nom de vue à la fonction de rendu, vous pouvez passer un chemin relatif ou absolu.

Exemple simple:

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

C’est assez simple

pour changer le dossier de vue d’Express quand on appelle res.render (), il suffit de définir le chemin où se trouvent les vues, dans votre cas,

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

Cela modifie le chemin où Express recherche les vues spécifiées.

Vous pouvez également obtenir le chemin relatif en utilisant require.resolve : res.render(require.resolve('./folder/with/views/viewname'));

(Désolé je ne peux pas encore commenter)

La réponse de @ nuzzolilo fonctionne bien. Mais si vous préférez ES6

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

Cela améliore simplement la lisibilité du code;)