我想在调用res.render()时更改Express的视图文件夹。
例如,如果我在/folder/file.js中调用res.render(viewName),我希望Express查找/ folder / views中的视图。
如果文件在/folder1/folder2/file.js中,我希望Express查找/ folder1 / folder2 / views中的视图
有可能吗?
答案 0 :(得分:95)
您可以使用方法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);
答案 1 :(得分:46)
您可以传递相对或绝对路径,而不是简单地将视图名称传递给渲染函数。
简单示例:
app.get('/your/path', function(req, res) {
//viewname can include or omit the filename extension
res.render(__dirname + '/folder/with/views/viewname'));
});
答案 2 :(得分:5)
这很简单
在调用res.render()时更改Express的视图文件夹, 只需设置视图所在的路径, 在你的情况下,
app.set('views','./folder1/folder2/views');
这会更改Express搜索指定视图的路径。
答案 3 :(得分:3)
(抱歉,我无法发表评论)
@nuzzolilo's answer效果很好。但如果您更喜欢ES6
app.get('/path', function (req, res) {
res.render(`${__dirname}/templates_dir/index`, { data: "value" });
});
这简单地提高了代码的可读性;)
答案 4 :(得分:2)
您还可以使用require.resolve
获取相对路径:
res.render(require.resolve('./folder/with/views/viewname'));
答案 5 :(得分:0)
设置视图位置的路径。
app.set('views', path.join(__dirname, '/views'));
设置视图引擎。
app.set('view engine','ejs');
完整的代码如下所示。
const express = require('express');
const path = require('path');
const app = express();
app.set('views', path.join(__dirname, '/views'));
app.set('view engine','ejs');
app.listen(3000, () => console.log('Application is running on'));