Expressjs app.render不起作用

当我打电话

app.get('/', function(req, res) { res.render('index', {locals: {title: 'Hello, Node!' }}); }); 

它输出

 TypeError: Object "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" + "<html>" + "</html>" + "<title>" + title + "</title>" + "<body>" + "</body>" + "<s>" + "Hello, World" + "</s>" has no method 'call' at ServerResponse._render (/usr/local/lib/node/.npm/express/2.2.2/package/lib/view.js:377:21) at ServerResponse.render (/usr/local/lib/node/.npm/express/2.2.2/package/lib/view.js:242:17) at Object.<anonymous> (/home/william/www/html_public/app.js:36:6) at param (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/middleware/router.js:148:21) at pass (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/middleware/router.js:164:10) at Object.router [as handle] (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/middleware/router.js:170:6) at next (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/http.js:204:15) at Object.bodyParser [as handle] (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/middleware/bodyParser.js:76:7) at next (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/http.js:204:15) at Object.methodOverride [as handle] (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/middleware/methodOverride.js:35:5) 

这是我的明确configuration

 app.configure(function(){ app.use(express.methodOverride()); app.use(express.bodyParser()); app.use(app.router); app.use(express.cookieParser()); app.set('view engine', 'haml'); app.set("view options", { layout: false }); // Set directorys app.use(express.static(public_dir)); app.set('views', __dirname + '/views'); }); 

我如何解决这个错误。 这似乎是调用不存在的函数?


这是haml代码

 !!! %html %title= title %body %s Hello, World 

固定!! 这个configuration可以和haml libary兼容

 var haml = require('haml'); app.register('.haml', { compile: function(str, options) { return function(locals) { return haml.render(str, {locals: locals}); } } }); 

你也使用哪个版本的express / node? 尝试升级到最新的稳定版本。

 // render var str = view.fn.call(options.scope, options); 

这就是你的观点。

 view.fn = engine.compile(view.contents, options) 

这就是创造这个function的原因。 .compile是在你的haml引擎中定义的。 我猜这是haml引擎中的一个错误,因为这是一个非标准的引擎。

哈姆不符合表示开箱。 所有的快速查看引擎都希望有一个.compile函数,它返回一个可以调用返回html的函数。 .compile中的.compile方法不会返回所期望的。

试试haml-js这是由快递员写的,由快递员维护。

或者,如果您阅读了app.register的文档,它将向您展示如何将任何视图引擎转换为兼容的视图引擎。