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

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

例如,如果我在/folder/file.js文件中调用res.render(viewName),我希望Express可以查看/ folder / views中的视图。

如果文件在/folder1/folder2/file.js里面,我想快速查看/ folder1 / folder2 / views里面的视图

可能吗 ?

您可以使用set()方法重新定义express的默认设置。

 app.set('views', path.join(__dirname, '/yourViewDirectory')); 
  • Express文档

对于dynamicpath更改,可以这样做:

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

您可以传递相对path或绝对path,而不是简单地将视图名称传递给渲染函数。

简单的例子:

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

这很简单

当你调用res.render()时,改变Express的视图文件夹,只需设置视图所在的path,在你的情况下,

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

这将更改Express将search指定视图的path。

你也可以使用require.resolveres.render(require.resolve('./folder/with/views/viewname'));来获取相对pathres.render(require.resolve('./folder/with/views/viewname'));

(对不起,我还不能评论)

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

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

这简单地提高了代码的可读性;)