2011-04-16 25 views
1

當我打電話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) 

這是我的快速配置

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 

固定!! 此配置固定兼容與HAML libary

var haml = require('haml'); 

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

回答

2

而且您使用的表達/節點的版本?嘗試升級到最新的穩定版本。

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

這就是呈現您的觀點。

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

這就是創建函數的原因。在你的haml引擎中定義了.compile。我猜這是haml引擎中的一個錯誤,因爲這是一個非標準引擎。

haml不符合表示開箱即用。所有的快速查看引擎預計將有一個.compile函數返回一個函數,可以調用返回html。 haml中的.compile方法不會返回明確期望的值。

嘗試haml-js這是由快遞員寫的,由快遞員維護。

或者,如果您閱讀app.register的文檔,它將向您展示如何將任何視圖引擎轉換爲兼容視圖的快速引擎。

+0

不,我正在使用哈姆,這是編譯的HTML – Will03uk 2011-04-16 14:19:45

+0

@ Will03uk你可能已經提到過。不需要downvote。 – Raynos 2011-04-16 14:25:29

+0

即時通訊使用節點v0.4.5和快遞v2.2.2 – Will03uk 2011-04-16 14:28:16