我不想使用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
答案 0 :(得分:5)
使用consolidate.js转换Underscore的模板函数,以接受3.x (path[, locals], callback)
中Express要求的格式。
答案 1 :(得分:2)
首先,您使用扩展名和对象调用app.engine
,而它将第二个参数作为函数(参见source documentation)。
此函数有3个参数:文件路径,选项和回调。
正如在documentation中所写的那样,建议使用consolidate.js
作为助手来使用不友好的模板引擎。
这是consolidate.js
引用的// assign the swig engine to .html files
app.engine('html', cons.underscore);
// set .html as the default extension
app.set('view engine', 'html');
的简单集成,适用于使用下划线:
{{1}}
另外,我不知道如何在Express下使用下划线处理你的layout.html,我认为它不可能开箱即用。
答案 2 :(得分:2)
var cons = require('consolidate');
//查看引擎设置
app.engine('html',cons.underscore);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'html');
在终端
npm install consolidate --save