2011-09-02 63 views
20

我有这样的代码,将呈现一个没有定义路由的玉模板。想想这个像express.static,但它调用与URL的res.render。如何使用express.js捕获node.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(); 
    } 
}); 

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

回答

39

一个更好的办法来做到这一点,而不是要求fs,并具有另一个回调,是使用渲染的回调:

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

伟大的发现。它仅在3.x文档中,但它也适用于2.x。 – respectTheCode

+1

更新了使用'res.send'而不是'res.end'的答案。 4.x文档[特别声明](http://expressjs.com/api.html#res.end)“如果您需要使用数据进行响应,请使用res.send()” –

+1

等方法,我认为这样做会如果处理模板时发生错误,则会生成404,但似乎不会。任何人都在意解释为什么它没有? –

0

您可以使用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 }); 
    } 
}); 
+0

res.render有一堆用于计算要使用的玉文件的逻辑。我希望我不需要重新创建这个逻辑。 – respectTheCode

1

到@Augustin Riedinger的答案类似,同样呈现变量时应用使用renderFile

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