【问题标题】:How can I catch a rendering error / missing template in node.js using express.js?如何使用 express.js 在 node.js 中捕获渲染错误/缺少模板?
【发布时间】:2011-11-09 04:17:57
【问题描述】:

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

【问题讨论】:

    标签: node.js express


    【解决方案1】:

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

    【讨论】:

    • 很棒的发现。它仅适用于 3.x 文档,但也适用于 2.x。
    • 更新了答案以使用 res.send 而不是 res.end。 4.x文档specifically states"如果需要用数据响应,改用res.send()等方法"
    • 我认为如果处理模板时出现错误,这会生成 404,但似乎没有。有人愿意解释为什么不这样做吗?
    • A 404 代码是您的服务器想要回复的请求,告诉查询浏览器conventionnaly 找不到该页面。在这一步,您服务器,您可以随意回复任何内容。如果你想发送 404 错误而不是重定向 /404 url,正确的做法是 here
    • 'render' 中的第二个参数表示什么?我说的是“my_page_im_not_sure_it_exists”之后的“{}”
    【解决方案2】:

    在调用res.render之前使用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])检查文件是否存在

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

    【讨论】:

    • 使用最新(0.8.x)版本的node,你应该使用fs.exists()
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您可以使用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 有一堆逻辑来确定要使用什么玉文件。我希望我不需要重新创建那个逻辑。
      猜你喜欢
      • 1970-01-01
      • 2014-02-13
      • 2011-06-04
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 2018-02-26
      • 1970-01-01
      相关资源
      最近更新 更多