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

时间:2011-09-02 13:09:06

标签: node.js express

我有这样的代码,它会渲染没有定义路径的玉模板。可以把它想象成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()没有抛出错误。相反,它正在呈现错误页面。有没有办法检测丢失的模板或任何渲染错误?

4 个答案:

答案 0 :(得分:43)

更好的方法是使用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);
    }
});

答案 1 :(得分:2)

在调用fs.exists(p, [callback])

之前,使用res.render检查文件是否存在

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

节点0.6.x及更早

在调用path.exists(p, [callback])

之前,使用res.render检查文件是否存在

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

答案 2 :(得分:1)

与@Augustin Riedinger的答案类似,使用renderFile渲染变量时同样适用:

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

答案 3 :(得分: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 });
    }
});