如何使用express.js捕获node.js中的渲染错误/缺失模板?

我有这样的代码将呈现一个没有定义的路线的玉模板。 想想这个像express.static,但它调用与URL的res.render。

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

问题是res.render()不会引发错误。 相反,它正在渲染一个错误页面。 有没有办法来检测缺less的模板或任何渲染错误?

一个更好的方法来做,而不是要求fs和另一个callback,将使用渲染的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); } }); 

在调用res.render之前fs.exists(p, [callback])使用fs.exists(p, [callback])来检查文件是否存在

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

节点0.6.x和更旧

在调用res.render之前path.exists(p, [callback])使用path.exists(p, [callback])检查文件是否存在

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

与@Augustin Riedinger的答案类似,使用renderFile渲染variables时renderFile

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

您可以使用fs.open来检查模板是否存在。

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