我用一个非常复杂的CMS,使用Node,Express和Dust with Consolidate。 CMS具有模块和小部件:
问题是每个模块和窗口小部件都有自己的视图文件夹,而Express只允许您设置一个" views目录",而在Dust文档中,我无法' ;甚至找到Dust在哪个目录中查找模板。
我的文件夹结构如下所示:
所以, module-n-controller.js 就是这样的:
// just pretend that this data came from the widget-n-controller.js
var data = {
"widget" : {
"view": "./widgets/widget-n/widget-n-view",
"data": widgetNData
}
}
res.render('./modules/module-n/module-n-view', data);
然后,在我的 module-n-view.dust 中,我想做这样的事情:
{#widget}
{>"{view}" data=data/}
{/widget}
所以问题是:如何设置这些视图的路径,并且 res 。渲染正确的方法来执行此操作,还是应该使用灰尘。呈现?
PS:我尝试了灰尘。渲染,我得到了#34;错误,无法找到模板"随着路径的每一个变化。
答案 0 :(得分:3)
<强>根/ app.js 强>
var app = require("express")(),
cons = require("consolidate");
// Do this to get DustJS rendering .html files
// So, in the file structure above, you can rename the views extensions from .dust to .html
app.engine('html', cons.dust);
app.set('view engine', 'html');
// Set the views directory to the root directory of the application
// This way you can access views into any directory inside your application
app.set('views', '.');
<强>根/部件/插件正/插件 - 正controller.js 强>
module.exports.index = function (req, res, next) {
return {
"widget" : {
"view": __dirname + '/widget-n-view',
"data": widgetNDataFromDB()
}
};
}
<强>根/模块/模块正/模块正controller.js 强>
module.exports.index = function(req, res, next){
var data = require("../../widgets/widget-n/widget-n-controller").index(req, res, next);
res.render(__dirname +'/module-n-view', data);
}
在呈现部分时,必须进行整合查找.html文件。 我不知道为什么,但是,当渲染局部时,整合似乎只查找.dust文件,即使你已经指定html作为应用程序和视图引擎。 如果您使用.dust扩展名,请跳过此步骤。
<强> node_modules /巩固/ LIB / consolidate.js 强>
搜索此功能:
exports.dust.render
在此功能的内部,您将找到以下内容:
var ext = 'dust'
, views = '.';
只需将其更改为:
var ext = 'html'
, views = '.';
很难弄明白......我真的希望它可以帮助其他人。