在nodeJS和Express框架中找不到文件时出错

Error handeling when file is not found in nodeJS and Express framework

本文关键字:找不到 文件 出错 框架 nodeJS Express      更新时间:2023-09-26

我想使用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);
    }
  });

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

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('/');
        }
    });
});

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

fs.exists()是一个时代错误,只因历史原因而存在。在您自己的代码中使用它几乎不应该有任何理由。

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

所以最好先捕获异常,然后再处理它:

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