根据调用res.render()的文件的位置更改Express视图文件夹


77

我想在调用res.render()时更改Express的视图文件夹。

例如,如果我在/folder/file.js内调用res.render(viewName),我希望Express在/ folder / views内查找视图。

如果文件位于/folder1/folder2/file.js内,我希望Express在/ folder1 / folder2 / views内查找视图

可能吗 ?

Answers:


122

您可以使用该方法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中的一个将覆盖另一个,不是吗?
塔里森2014年

您能指出我有关app.get('view')的文档吗?我似乎找不到。我在此处的列表中看不到“视图”:expressjs.com/en/api.html#app.settings.table。我不喜欢使用未记录功能的想法。
nuzzolilo 2015年

54

除了将视图名称简单地传递给render函数之外,您还可以传递相对路径或绝对路径。

简单的例子:

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

5
这似乎比覆盖渲染功能更容易!

10

那很简单

要在一个人调用res.render()时更改Express的视图文件夹,只需设置视图所在的路径即可,

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

这将更改Express搜索指定视图的路径。


1
这是最好的bcs,最简单,没有其他要求require。...简单。
罗尼·罗斯顿

正确@MonarchWadia
Abdalla Arbab

当多个请求重置视图文件夹时,这会引入竞争条件吗?
阿赞查尔斯

4

(抱歉,我无法发表评论)

@nuzzolilo的答案效果很好。但是如果您喜欢ES6

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

这只是提高了代码的可读性;)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.