0

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

2 回答 2

0

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

fs.exists() 是不合时宜的,仅出于历史原因而存在。几乎不应该有理由在您自己的代码中使用它。

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

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

try {
    res.render('art/' + project);
} 
catch(e) {
    if (e.code === 'ENOENT')
        res.redirect('/');
    else
        throw e;
}
于 2014-06-12T08:50:28.663 回答
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('/');
        }
    });
});
于 2013-09-02T12:25:26.017 回答