Змінити папку Express view на основі того, де знаходиться файл, який викликається res.render ()


77

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

Наприклад, якщо я викликаю res.render (viewName) всередині /folder/file.js, я хотів би, щоб Express шукав подання всередині / папки / виглядів.

Якщо файл знаходиться всередині /folder1/folder2/file.js, я хотів би, щоб Express шукав подання всередині / folder1 / folder2 / views

Це можливо ?

Відповіді:


123

Ви можете використовувати метод, set()щоб перевизначити налаштування Express за замовчуванням.

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

4
Це виглядає добре, але як я можу зробити це динамічним? Якщо два користувачі одночасно отримують доступ до різних шляхів, один із app.set замінить іншого, чи не так?
Talysson

Чи можете ви вказати мені документацію щодо app.get ('перегляд')? Здається, я не можу його знайти. Я не бачу "перегляду" у списку тут: expressjs.com/en/api.html#app.settings.table . Мені не подобається ідея використання недокументованих функцій.
nuzzolilo

56

Замість того, щоб просто передати ім'я подання функції візуалізації, ви можете передати відносний або абсолютний шлях.

Простий приклад:

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

6
Це здається waaaay простішим, ніж перевизначення функції візуалізації!
камінь

11

Це досить просто

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

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

Це змінює шлях, де Express здійснював би пошук вказаних подань.


1
це найкраще bcs це найпростіше, ніяких додаткових require. ... легко.
Ронні Ройстон,

Правильно @MonarchWadia
Абдалла Арбаб

Чи вводить це умову перегонів, коли кілька запитів скидають папку подання?
charles-allen

4

(Вибачте, я поки не можу коментувати)

Відповідь @ nuzzolilo працює добре. Але якщо ви віддаєте перевагу ES6

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

Це просто покращує читабельність коду;)


3

Ви також можете отримати відносний шлях, використовуючи require.resolve: res.render(require.resolve('./folder/with/views/viewname'));

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.