2011-09-02 5 views
20

Tôi có mã như thế này sẽ tạo ra một mẫu ngọc bích mà không có một tuyến đường được xác định. Hãy nghĩ về điều này giống như express.static nhưng nó gọi res.render với url.Làm thế nào tôi có thể bắt gặp lỗi hiển thị/mẫu bị thiếu trong node.js bằng cách sử dụng express.js?

app.use(function (req, res, next) { 
    try { 
     res.render(req.url.substring(1), { title: "No Controller", user: req.session.user }); 
    } catch (err) { 
     console.log(err) 
     next(); 
    } 
}); 

Vấn đề là res.render() không phải là lỗi. Thay vào đó, nó sẽ hiển thị một trang lỗi. Có cách nào để phát hiện mẫu bị thiếu hoặc bất kỳ lỗi hiển thị nào không?

Trả lời

39

Một cách tốt hơn để làm điều đó, thay vì yêu cầu fs và có gọi lại khác, sẽ được sử dụng làm của callback:

res.render(my_page_im_not_sure_it_exists, {}, function(err, html) { 
    if(err) { 
     res.redirect('/404'); // File doesn't exist 
    } else { 
     res.send(html); 
    } 
}); 
+4

Tìm kiếm tuyệt vời. Chỉ trong tài liệu 3.x của nó nhưng nó hoạt động trong 2.x là tốt. – respectTheCode

+1

Đã cập nhật câu trả lời để sử dụng 'res.send' thay vì' res.end'. 4.x tài liệu [cụ thể tiểu bang] (http://expressjs.com/api.html#res.end) "Nếu bạn cần phải trả lời với dữ liệu, thay vì sử dụng phương pháp như res.send()" –

+1

Tôi nghĩ rằng điều này sẽ tạo 404 nếu có lỗi khi xử lý mẫu, nhưng có vẻ như không. Bất cứ ai quan tâm để giải thích lý do tại sao nó không? –

0

Bạn có thể sử dụng fs.open để kiểm tra xem mẫu có tồn tại không.

app.use(function (req, res, next) { 
    fs.open(__dirname + '/views/' + req.url.substring(1) + '.jade', 'r', function (err) { 
     if(err) { 
     console.log(err); 
     return next(); 
     } 
     res.render(req.url.substring(1), { title: "No Controller", user: req.session.user }); 
    } 
}); 
+0

res.render có một loạt logic để tìm ra tệp ngọc bích nào sẽ sử dụng. Tôi đã hy vọng rằng tôi sẽ không cần phải tái tạo logic đó. – respectTheCode

2

Sử dụng fs.exists(p, [callback]) để kiểm tra nếu tập tin tồn tại trước khi gọi res.render

http://nodejs.org/docs/latest/api/fs.html#fs_fs_exists_path_callback

Node 0.6.x trở lên

Sử dụng path.exists(p, [callback]) để kiểm tra nếu tập tin tồn tại trước khi gọi res.render

http://nodejs.org/docs/v0.6.0/api/path.html#path.exists

+0

Với phiên bản mới nhất (0.8.x) của nút, bạn nên sử dụng 'fs.exists()' – SomeKittens

1

Tương tự như câu trả lời @Augustin Riedinger của, cùng áp dụng khi vẽ để biến sử dụng renderFile:

var html = jade.renderFile('path/to/file.jade', context, function(err, html) {};