Изменить папку просмотра Express, основанной на том, где вызывается файл, который res.render()

Я хотел бы изменить папку просмотра Express, когда я вызываю res.render().

Например, если я вызываю res.render(viewName) внутри /folder/file.js, я бы хотел, чтобы Express просматривал представление внутри /folder/views.

Если файл находится внутри /folder 1/folder2/file.js, я бы хотел, чтобы этот Express искал представление внутри /folder 1/folder2/views

Возможно ли это?

Ответ 1

Вы можете использовать метод set() для переопределения экспресс-настроек по умолчанию.

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

Для динамического изменения пути вы можете сделать что-то вроде этого:

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

Ответ 2

Вместо простой передачи имени вашего представления в функцию рендеринга, вы можете передать относительный или абсолютный путь.

Простой пример:

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

Ответ 3

Это довольно простое

чтобы изменить папку просмотра Express, когда вы вызываете res.render(), просто установите путь, где расположены виды, в вашем случае

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

Это изменяет путь, в котором Express будет искать указанные виды.

Ответ 4

(Извините, что я еще не могу прокомментировать)

@nuzzolilo answer работает хорошо. Но если вы предпочитаете ES6

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

Это просто улучшает читаемость кода;)

Ответ 5

Вы также можете получить относительный путь, используя require.resolve: res.render(require.resolve('./folder/with/views/viewname'));