2012-08-09 55 views
3

我似乎並沒有讓JSHTML在Node.js的Express.js上作爲模板引擎工作。當我安裝我的Express.js的應用程序,爲我創建了一個基本的應用程序,我運行它,我得到這個錯誤信息:JSHTML不能在Node.js中使用Express.js

500 TypeError: Property 'engine' of object #<View> is not a function 
at View.render (/Users/blackbook/nodejs/ds/node_modules/express/lib/view.js:75:8) 
at Function.app.render (/Users/blackbook/nodejs/ds/node_modules/express/lib/application.js:504:10) 
at ServerResponse.res.render (/Users/blackbook/nodejs/ds/node_modules/express/lib/response.js:677:7) 
at exports.index (/Users/blackbook/nodejs/ds/routes/index.js:7:7) 
at callbacks (/Users/blackbook/nodejs/ds/node_modules/express/lib/router/index.js:165:11) 
at param (/Users/blackbook/nodejs/ds/node_modules/express/lib/router/index.js:139:11) 
at pass (/Users/blackbook/nodejs/ds/node_modules/express/lib/router/index.js:146:5) 
at Router._dispatch (/Users/blackbook/nodejs/ds/node_modules/express/lib/router/index.js:173:5) 
at Object.router (/Users/blackbook/nodejs/ds/node_modules/express/lib/router/index.js:33:10) 
at next (/Users/blackbook/nodejs/ds/node_modules/express/node_modules/connect/lib/proto.js:190:15) 

我app.js看起來是這樣的(這是什麼Express.js爲我創建):

/** 
* Module dependencies. 
*/ 

var express = require('express') 
    , routes = require('./routes') 
    , 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', 'jshtml'); 
    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'))); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler()); 
}); 

app.get('/', routes.index); 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log("Express server listening on port " + app.get('port')); 
}); 

我有這個安裝:

+0

你使用npm安裝了jshtml嗎? 無論如何,我認爲express 3.0不支持jshtml呢。 Express 3.0已經改變了很多佈局上的東西..嘗試使用Express 2.0或只是改變玉石和測試。 – 2012-08-09 14:01:28

+0

@RafaelMotta是的,我已經安裝了nsh的jshtml。我試過使用Express 2.0,但是我也無法使它工作。我尋找一個模板引擎,可以使用我的模板「masterpage」,和jshtml以一個不錯的方式。我已經研究過EJS,但是這似乎是支持它的。我知道玉能做到,但我不喜歡用玉來寫我的模板。 – Raskolnikoov 2012-08-09 14:51:05

+0

我覺得express提供了母版頁的概念,而不是模板引擎。在Express 3.0中,您不再有佈局。但嘗試使用生態模板..它具有母版頁的概念。這就像EJS,但你用咖啡寫代碼。 – 2012-08-09 17:05:21

回答

3

JSHTML當前與Express.js一起工作2.有計劃讓引擎與Express.js 3一起工作,但目前我忙於享受夏季!預計在冬天會解決這個問題!

+0

謝謝你的回答@Elmer – Raskolnikoov 2012-08-16 09:47:50

0

consolidationate.js被用作許多模板引擎之間的橋樑和表達。如果你的引擎不支持檢查源代碼。大多數引擎需要執行15行代碼。

+0

如果我看看github上的jshtml,我發現它可以與express一起使用。但是,如果我一步一步跟進,那麼它仍然可以發揮作用。所以可能對jshtml的支持表達得很快。 :/ https://github.com/elmerbulthuis/jshtml – Raskolnikoov 2012-08-09 16:47:09

+0

表達式在3.x中稍微調整了它的模板系統,所以你的模板引擎可能無法工作了。 – Pickels 2012-08-10 16:46:26

2

根據https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x,您可以使用app.engine進行2-x兼容性。

例如

var fs = require("fs"); 
var jshtml = require("jshtml"); 
app.engine("jshtml", function (path, options, fn) { 
    fs.readFile(path, 'utf8', function (err, str) { 
     if (err) return fn(err); 
     str = jshtml.compile(str,options)(options).toString(); 
     fn(null, str); 
    }); 
}); 
0

嘗試以下。它適合我,就像你一樣。

首先,通過npm安裝jshtml-express,然後執行以下操作。

var app = express(); 
**app.engine('jshtml', require('jshtml-express'));** 

// All environments 
app.set('port', process.env.PORT || 3000); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'jshtml'); 
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'))); 

我希望它也能適用於你。