2012-11-23 15 views
5

sto creando questo modello:Node.JS ejs includono errore

<% include head %> 
<Placemark> 
    <name><%=name%></name> 
    <description><%=description%></description> 
    <Point> 
     <coordinates><%=coordinates%></coordinates> 
     </Point> 
</Placemark> 
<% include foot %> 

ma ottengo sempre questo errore:

if (!filename) throw new Error('filename option is required for includ 
         ^

Directory:

[email protected]:~/node-socket.io/socket.io/examples/kml$ ls -1 
app.js 
foot.ejs 
head.ejs 
placemark.ejs 
Can

qualcuno aiuto, I secondo la cassetta degli attrezzi tutto dovrebbe funzionare

app.js:

var http = require('http'); 
var ejs = require('ejs'); 

var fs = require('fs') 

http.createServer(function (req, res) { 

res.writeHead(200, {'Content-Type': 'text/xml'}); 

fs.readFile('placemark.ejs', 'utf8', function (err, template) { 

var content = ejs.render(template,{ 
    name:"test name", 
    description:"this is the description", 
    coordinates:"-122.0822035425683,37.42228990140251,0" 
}); 

res.write(content); 
res.end() 
}); 
}).listen(8000); 
console.log('Server listening at at xxxxxxxx'); 

utilizzando ejs rendo modello, che costruisce da altri modelli. Usando gli ejs-locals si dice che non ha alcun metodo di rendering. C'è un modo per farlo con solo 'ejs' ??

+0

quale versione di ejs ed express stai usando? Questo sembra corretto ed è quello che uso. https://github.com/visionmedia/ejs – chovy

+0

/home/justas ├── [email protected] ├─┬ [email protected] – sauletasmiestas

risposta

10

Ecco un esempio di lavoro:

Sembra è necessario passare nel nome del file del modello, al fine di essere in grado di utilizzare includere - vedi example here

var http = require('http'); 
var ejs = require('ejs'); 

var fs = require('fs'); 

http.createServer(function (req, res) { 

res.writeHead(200, {'Content-Type': 'text/xml'}); 

fs.readFile('placemark.ejs', 'utf8', function (err, template) { 

var content = ejs.render(template,{ 
    name:"test name", 
    description:"this is the description", 
    coordinates:"-122.0822035425683,37.42228990140251,0", 
    filename: __dirname + '/placemark.ejs' 
}); 

res.write(content); 
res.end() 
}); 
}).listen(8000); 
console.log('Server listening at at xxxxxxxx'); 
+0

Non riconosce "partial" "ReferenceError: ejs: 1 > > 1 | <% - partial ('head')%> 2 | 3 | <%=name%> 4 | <% = description%> parziale non definito ' – sauletasmiestas

+0

stai usando require (' ejs ') nella tua app? – Alex

+1

parziale non è supportato dai più recenti ejs ed express 3. Avresti bisogno di ejs-locals per questo. – chovy

3

Recentemente ho trovato questo anche l'errore Ho visto la risposta di alexjamesbrown, ma non mi è piaciuta la soluzione. Preferirei non includere la variabile filename per ogni render; il codice può diventare disordinato! Preferirei includere il file all'interno delle singole visualizzazioni.

Così ho esaminato il file lib ejs e ho rimosso il requisito per la variabile filename.

troverete quanto segue in \ ejs \ lib \ ejs.js on line 157

if (!filename) throw new Error('filename option is required for includes'); 

Semplicemente commentare quella linea e utilizzare <% include views\include.ejs %> nei file .ejs per includere le vostre opinioni individuali.

Quanto sopra è valida per la versione 0.8.4 ejs

+0

wow, sei fantastico, questo è fantastico. ho appena aggiunto un bug su questo su github.https://github.com/visionmedia/ejs/issues/137 – JasonS

+0

Cheers @JasonS - Solo per aggiornare questo non è più sulla linea 157. Cerca questa riga nel file ejs \ lib \ ejs.js. –

0

Proprio urtato questa domanda ed ecco come si può definire una cartella modello e includere quei modelli nel file ejs principale:

var renderedHtml = ejs.render(content, 
          { 
           data: data, 
           filename: __dirname + '/app/templates/*' 
          } 
         );