2012-08-09 47 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'))); 

我希望它也能适用于你。