2013-02-16 16 views
7

Nie chcę używać silnika szablonowego Jade, który domyślnie jest obsługiwany przez Express. Próbowałem się do tej instrukcji, ale to się nie powiedzie:Jak używać szablonów podkreślników zamiast Jade w Express?

http://blog.luksidadi.com/expressjs-underscore-template/

Błąd w pytaniu:

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) 

uzyskać to przy próbie uruchomienia serwera z:

node app.js 

Jak rozwiązać ten problem?

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')); 
}); 

szlaki/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

Więcej kontekście, proszę. Ślady stosu są zwykle bezużyteczne bez kodu, z którym można się do nich odnieść. –

+0

@JackManey Zaktualizowano pytanie, aby dołączyć kod. Po prostu poszedłem za przewodnikiem po tym łączu. – TK123

+0

Więc możesz wypróbować 'ejs',' jshtml' lub 'hogan.js'? –

Odpowiedz

5

Zastosowanie consolidate.js przekonwertować funkcje szablonów podkreślenia, aby zaakceptować format ekspresowe wymaga w 3.x (path[, locals], callback).

2

Najpierw wywołujemy app.engine z nazwą rozszerzenia i obiektem, podczas gdy funkcja przyjmuje drugi parametr (patrz source documentation).

Ta funkcja ma 3 parametry: ścieżkę do pliku, opcje i wywołanie zwrotne.

Jako, napisany w documentation, zaleca się używanie consolidate.js jako pomocnika do korzystania z silników szablonów, które nie są przyjazne ekspresowi.

Oto prosta integracja consolidate.js cytat z jego README i przystosowany do korzystania podkreślenia:

// assign the swig engine to .html files 
app.engine('html', cons.underscore); 

// set .html as the default extension 
app.set('view engine', 'html'); 

Również nie wiem jak obsługiwać layout.html z podkreśleniem pod Express nie wiem myślę, że to możliwe po wyjęciu z pudełka.

2
var cons = require('consolidate'); 

// widok silnik setup

app.engine('html',cons.underscore); 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'html'); 

w terminalu

npm install consolidate --save 
Powiązane problemy