web-dev-qa-db-fra.com

Modifier le dossier de la vue Express en fonction de l'emplacement du fichier appelé res.render ()

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 ?

64
Talysson

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);
103
Pedro Nasser

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'); 
});​​​​​​​​​​
48
nuzzolilo

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.

5
Vickar

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

3
Collin

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

2
Luke Chinworth