如何在Node.js中渲染doT.js模板?

5

你好,我想知道如何在dot.js模板引擎中渲染输出。我认为这是一个关于nodejs模板的通用问题。(阅读评论获取更多信息)。我选择这个模板引擎而不是jade或ejs,是因为它似乎是最快的引擎。

以下是我的app.js:

var express = require('express'),
    app = express.createServer(),
    doT = require('doT'),
    pub = __dirname + '/public',
    view =  __dirname + '/views';

app.configure(function(){
    app.set('views', view);
    app.set('view options', {layout: false});
    app.set('view engine', 'dot');
    app.use(app.router);
});

app.register('.html', {
    compile: function(str, opts){
        return function(locals){
            return str;
        }
    }
});


app.get('/', function(req, res){

    //This is where I am trying to send data to the front end....
    res.render('index.html', { output: 'someStuff' });

});

这是我的HTML代码:

<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>Index</title>
</head>
<body>

//This is where I am trying to receive data and output it...
{{=it.output}}

</body>
</html>

我找不到关于它的好文档。这并不足够:http://olado.github.com/doT/。如果您能帮忙,那就太感谢了。这将显著提高我对于数据如何在nodejs中传递到视图的理解。谢谢。
4个回答

14
你需要让express知道如何使用doT作为模板引擎,像这样:
app.set("view engine", "html");
app.register('.html', doT);

谢谢,看起来好像可以了。从创建者那里得到答案总是令人兴奋的。我还需要弄清楚如何迭代从mongodb中提取的记录,但那将是另一个问题...谢谢。 - user
嗨,也许你可以看看这个问题:http://stackoverflow.com/questions/9252191/show-all-of-data-comming-from-mongodb-and-render-it-in-dot-js-templating-engine,它基于你在这里回答的那个问题。我认为你是最有资格解决这个问题的人。如果你能帮忙就请帮忙吧。 - user
你能否请看一下这个问题:http://stackoverflow.com/questions/9252191/show-all-of-data-comming-from-mongodb-and-render-it-in-dot-js-templating-engine - user
1
@olado,Express 3 的解决方案是什么?使用这个是否是一个好主意?谢谢。 - esp

5

我的帖子是一个厚颜无耻的宣传,但可能会对某些人有所帮助。

我对现有的Express 3.x模块的工作方式不是很满意,因此我编写了一个名为dot-emc的模块:

https://github.com/nerdo/dot-emc

使用方式与上面发布的内容类似。使用nom进行安装:

npm install dot-emc

然后将其设置为默认的视图引擎。我更喜欢使用.def扩展名,因为我的文本编辑器将.dot文件识别为Graphviz文件,所以语法略有不同:

app.engine("def", require("dot-emc").__express);
app.set("view engine", "def");

你可以像使用其他视图引擎一样在路由中开始使用它,例如:

app.get("/", function(req, res) {
    res.render("index", {"title": "title goes here"});
});

由于你的插件是旨在帮助人们,因此它是受欢迎的,毕竟这是这个网站的全部意义,为了帮助大家... - user
谢谢cue8chalk。这比应该找到的要难。 - Druska

1
如果您正在运行Express 3,它尚未得到支持。但是,您可以使用express-dot:

npm install express-dot

然后在配置中使用。

app.set('view engine', 'dot' );
app.engine('dot', require('express-dot').__express );

然后在路由中:

res.render('profile', {}); // you will need to create views/profile.dot

1

我知道这是一个老问题,但最近我想测试在标准生成的Express 4.x.x应用程序中使用doT。我没有找到@olado的express示例与我的生成应用程序匹配。我尝试了不同的插件(让它工作,但不满意),所以我最终写了模板引擎,以便获得预编译的点文件,并支持包含(#)而不需要任何额外的插件:

var users = require('./routes/users');
// Standard app above this

var dot = require("dot").process({ 
  path: (__dirname + "/views")
});

var app = express();

// view engine setup
app.engine('dot', function(template, options, cb){
    // using .dot files
    var temp = path.parse(template).name;

    var cont = dot[temp](options);

    return cb(null, cont);


    // Or as one liner
    // return cb(null, dot[path.parse(template).name](options));

    // If you want to do error checking, return the error as callback functions first arg
    // return cb(new Error('Something went wrong');
});

app.set('views', path.join(__dirname, './views'));
app.set('view engine', 'dot');

// Standard generated app below this

现在我可以在路由中像这样(对于index.js)使用标准的“res.render”方式:
/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

记得在.dot模板文件中使用{{it.value}}。在上面的基本示例中,index.dot将如下所示:
<!DOCTYPE html>
<html>
  <head>
    <title>{{=it.title}}</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>{{=it.title}}</h1>
    <p>Welcome to {{=it.title}}</p>
  </body>
</html>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接