Змінити папку 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.