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