Je souhaite modifier le dossier d'affichage d'Express lorsque j'appelle res.render ().
Par exemple, si j'appelle res.render (nomVue) dans /folder/file.js, j'aimerais que Express recherche la vue dans/folder/views.
Si le fichier est dans /folder1/folder2/file.js, j'aimerais qu'Express cherche la vue dans/folder1/folder2/views
C'est possible ?
Vous pouvez utiliser la méthode set()
pour redéfinir les paramètres par défaut d’express.
app.set('views', path.join(__dirname, '/yourViewDirectory'));
Pour un changement de chemin dynamique, 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 transmettre 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 vues 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 change le chemin où Express chercherait les vues spécifiées.
(Désolé, je ne peux pas encore commenter)
La réponse de @ nuzzolilo fonctionne bien. Mais si vous préférez l'ES6
app.get('/path', function (req, res) {
res.render(`${__dirname}/templates_dir/index`, { data: "value" });
});
Cela améliore simplement la lisibilité du code;)
Vous pouvez également obtenir le chemin relatif en utilisant require.resolve
: res.render(require.resolve('./folder/with/views/viewname'));