如何在Express中使用Underscore模板而不是Jade?

我不想使用默认使用Express的Jade模板引擎。 我试图按照这个指南,但它失败了:

http://blog.luksidadi.com/expressjs-underscore-template/

有问题的错误是:

node.js:201 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: callback function required at Function.engine (/home/me/blog/node_modules/express/lib/application.js:173:38) at Object.<anonymous> (/home/tk/blog/app.js:28:5) at Module._compile (module.js:432:26) at Object..js (module.js:450:10) at Module.load (module.js:351:31) at Function._load (module.js:310:12) at Array.0 (module.js:470:10) at EventEmitter._tickCallback (node.js:192:40) 

当我尝试启动服务器时遇到以下情况:

 node app.js 

如何解决这个问题?

app.js:

 /** * Module dependencies. */ var express = require('express') , routes = require('./routes') , user = require('./routes/user') , http = require('http') , path = require('path'); var app = express(); app.configure(function(){ app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); //app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); }); // Add these lines to register underscore template var _ = require('underscore'); app.engine('.html', { compile: function(str, options){ var compiled = require('underscore').template(str); return function(locals) { return compiled(locals); }; } }); app.configure('development', function(){ app.use(express.errorHandler()); }); app.get('/', routes.index); app.get('/users', user.list); http.createServer(app).listen(app.get('port'), function(){ console.log("Express server listening on port " + app.get('port')); }); 

路线/ index.js:

 /* * GET home page. */ exports.index = function(req, res){ res.render('index.html', { title: 'Express' }); }; 

的layout.html:

 < html > < head > < title ><%=title%>< /title > < /head > < body > <%=body%> < /body > < /html > 

index.html的:

 Hello world 

使用consolidate.js将Underscore的模板函数转换为接受3.x (path[, locals], callback) Express所需的格式。

首先,你用一个扩展名和一个对象调用app.engine ,而另一个函数作为第二个参数(参见源文档 )。

这个函数有3个参数:文件path,选项和callback。

正如在文档中写的,build议使用consolidate.js作为助手来使用不友好的模板引擎。

这里简单的整合了自己的README引用的consolidate.js .js文件,并使用下划线:

 // assign the swig engine to .html files app.engine('html', cons.underscore); // set .html as the default extension app.set('view engine', 'html'); 

此外,我不知道如何处理您的layout.html Express下的下划线,我不认为这是可能的开箱即用。

 var cons = require('consolidate'); 

//查看引擎设置

 app.engine('html',cons.underscore); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'html'); 

在terminal

 npm install consolidate --save