Как я могу поймать ошибку/отсутствующий шаблон рендеринга в node.js, используя express.js?
У меня есть такой код, который будет отображать шаблон нефрита без определенного маршрута. Подумайте об этом, как express.static, но он вызывает res.render с URL-адресом.
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() не выбрасывает ошибку. Вместо этого он создает страницу с ошибкой. Есть ли способ обнаружить отсутствующий шаблон или любые ошибки рендеринга?
Ответы
Ответ 1
Лучший способ сделать это, вместо того чтобы требовать fs
и иметь другой обратный вызов, - использовать обратный вызов render:
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);
}
});
Ответ 2
Используйте fs.exists(p, [callback])
, чтобы проверить, существует ли файл перед вызовом res.render
http://nodejs.org/docs/latest/api/fs.html#fs_fs_exists_path_callback
Node 0.6.x и старше
Используйте path.exists(p, [callback])
, чтобы проверить, существует ли файл перед вызовом res.render
http://nodejs.org/docs/v0.6.0/api/path.html#path.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 });
}
});