在节点JS和Express框架中找不到文件时的错误处理

时间:2013-09-02 12:20:13

标签: javascript node.js express

我想使用node / express显示多个html / jade文件。

我正在尝试为处理不存在的文件创建基本规则。

如果我要编写此代码,我将不会处理错误响应,但它会起作用:

app.get('/art/:project', function(req, res){
        var project = req.param('project');
        res.render('art/' + project);
    });

如果我正在编写此代码,它将正确处理错误,但由于某种原因,当文件存在时,不会显示页面。

 app.get('/art/:project', function(req, res){
        var project = req.param('project');
        res.render('art/' + project, function(err, html) {
          if (err) {
            res.redirect('/');
         }
       });
    });

我错过了什么?

我发现这会起作用但看起来非常无效:

  res.render('art/' + project, function(err, html) {
    console.log(err, html);
    if (err) {
        res.redirect('/');
    } else {
        res.render('art/' + project);
    }
  });

2 个答案:

答案 0 :(得分:0)

在尝试渲染之前检查文件是否存在不是更好。

var fs = require('fs');

app.get('/art/:project', function(req, res){
    var project = req.param('project');
    fs.exists('art/' + project + '.jade', function(exists) {
        if (exists) {
            res.render('art/' + project);
        } else {
            res.redirect('/');
        }
    });
});

答案 1 :(得分:0)

检查它的存在是否正常,但文档建议:

  

fs.exists()是一种时代错误,只是出于历史原因而存在。   几乎没有理由在你自己的代码中使用它。

     

特别是,在打开文件之前检查文件是否存在是一个   让你容易受到竞争条件影响的反模式:另一种   进程可能会在调用fs.exists()和之间删除文件   fs.open()。只需打开文件并处理错误即可   那里。

因此,抓住异常然后处理它会更好:

try {
    res.render('art/' + project);
} 
catch(e) {
    if (e.code === 'ENOENT')
        res.redirect('/');
    else
        throw e;
}