2012-11-23 37 views
5

tôi đang tạo ra mẫu này:Node.js EJS bao gồm lỗi

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

Nhưng tôi luôn nhận được lỗi này:

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

Thư mục:

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

Có thể ai đó giúp đỡ, tôi theo hộp công cụ, mọi thứ sẽ hoạt động

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

sử dụng ejs Tôi tạo mẫu, cấu trúc từ các mẫu khác. Sử dụng ejs-locals nó nói rằng nó không có phương thức render. Có cách nào để làm điều này chỉ với 'ejs' không ??

+0

gì phiên bản của ejs và express bạn đang sử dụng? Điều này có vẻ đúng và là những gì tôi sử dụng. https://github.com/visionmedia/ejs – chovy

+0

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

Trả lời

10

Dưới đây là một ví dụ làm việc:

Có vẻ bạn cần phải vượt qua trong tên tập tin của mẫu, để có thể sử dụng bao gồm - Xem 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

Nó không nhận ra "một phần" 'ReferenceError: ejs: 1 > > 1 | <% - một phần ('đầu')%> 2 | 3 | <%=name%> 4 | <% = description%> một phần không được xác định ' – sauletasmiestas

+0

bạn đang sử dụng yêu cầu (' ejs ') trong ứng dụng của bạn? – Alex

+1

một phần không được hỗ trợ bởi ejs mới nhất và thể hiện 3. Bạn sẽ cần ejs-người dân địa phương cho điều đó. – chovy

3

Gần đây tôi đi qua này cũng vậy. Tôi thấy câu trả lời của alexjamesbrown, nhưng tôi không thích giải pháp. Tôi không muốn bao gồm biến tên tệp cho mỗi lần hiển thị; mã có thể trở nên lộn xộn! Tôi muốn bao gồm các tập tin bên trong các quan điểm cá nhân.

Vì vậy, tôi đào sâu vào tệp ejs lib và xóa yêu cầu cho biến tên tệp.

Bạn sẽ tìm thấy những điều sau trong \ EJS \ lib \ ejs.js trên đường dây 157

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

Đơn giản chỉ cần nhận xét ra dòng đó và sử dụng trong các tập tin <% include views\include.ejs %> .ejs bạn để bao gồm quan điểm cá nhân của bạn.

Trên đây là hợp lệ cho phiên bản EJS 0.8.4

+0

wow, bạn thật tuyệt vời, điều này thật tuyệt. tôi chỉ cần thêm một lỗi về điều này trên github.https://github.com/visionmedia/ejs/issues/137 – JasonS

+0

Chúc mừng @JasonS - Chỉ cần cập nhật nội dung này không còn trên dòng 157. Tìm kiếm dòng này trong tệp ejs \ lib \ ejs.js. –

0

Chỉ tình cờ gặp câu hỏi này và dưới đây là cách bạn có thể xác định một mẫu thư mục và bao gồm những người mẫu trong tập tin EJS chính của bạn:

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