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

如何使用express.js捕获node.js中的渲染错误/缺少模板?,node.js,express,Node.js,Express,我有这样的代码,可以在没有定义路由的情况下呈现jade模板。可以将其与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.lo

我有这样的代码,可以在没有定义路由的情况下呈现jade模板。可以将其与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()没有抛出错误。而是呈现一个错误页面。是否有方法检测缺少的模板或任何渲染错误?

您可以使用
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 });
    }
});
在调用
res.render之前,使用
fs.exists(p[callback])
检查文件是否存在

节点0.6.x及以上版本

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


一个更好的方法是使用render的回调,而不是要求使用
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);
    }
});

与@Augustin Riedinger的答案类似,当使用以下方法呈现变量时,同样适用:


res.render有一系列逻辑来确定要使用的jade文件。我希望不需要重新创建该逻辑。对于最新(0.8.x)版本的node,您应该使用
fs.exists()
Great find。它只存在于3.x文档中,但也适用于2.x。更新了答案以使用
res.send
而不是
res.end
。4.x文档“如果您需要使用数据进行响应,请改用res.send()等方法。”我认为如果处理模板时出错,这将生成404,但似乎没有。有人想解释一下为什么没有找到吗?
404
代码是您的服务器想要回复的请求,告诉查询浏览器找不到该页面。在这一步中,您是服务器,您可以自由地回复任何您想要的内容。如果要发送404错误而不是重定向
/404
url,正确的方法是。render中的第二个参数指示什么?我说的是“我的网页不确定它是否存在”之后的“{}”
var html = jade.renderFile('path/to/file.jade', context, function(err, html) {};