2013-02-16 12 views
7

Non voglio usare il motore di template di giada che viene fornito di default con Express. Ho provato a seguire questa guida, ma viene a mancare:Come utilizzare i modelli Underscore invece di Jade in Express?

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

L'errore in questione è:

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) 

ottengo questo quando provo ad avviare il server con:

node app.js 

Come risolvere questo?

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

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

Ulteriori contesto, per favore. Le tracce dello stack sono di solito inutili senza codice con cui fare riferimento a esse. –

+0

@JackManey Aggiornamento della domanda per includere il codice. Ho praticamente seguito la guida su questo link. – TK123

+0

Quindi puoi provare 'ejs',' jshtml' o 'hogan.js'? –

risposta

5

Usa consolidate.js per convertire le funzioni template di sottolineatura di accettare il formato Express richiede in 3.x (path[, locals], callback).

2

In primo luogo, si sta chiamando app.engine con un nome di estensione e un oggetto mentre esso svolge una funzione come secondo parametro (vedere source documentation).

Questa funzione ha 3 parametri: il percorso del file, le opzioni e il callback.

Come, scritto nel numero documentation, è consigliabile utilizzare consolidate.js come helper per utilizzare motori di template non espliciti.

Ecco una semplice integrazione di consolidate.js citato dalla sua README e adattato per usare sottolineatura:

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

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

Inoltre, non so come gestire il vostro layout.html con sottolineatura sotto Express, non lo faccio pensate che sia possibile out of the box.

2
var cons = require('consolidate'); 

// vista motore di installazione

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

in terminal

npm install consolidate --save 
Problemi correlati