我有这样的代码,它会渲染没有定义路径的玉模板。可以把它想象成express.static,但它会用url调用res.render。
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()没有抛出错误。相反,它正在呈现错误页面。有没有办法检测丢失的模板或任何渲染错误?
答案 0 :(得分:43)
更好的方法是使用render的回调,而不是要求fs
并进行另一次回调:
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);
}
});
答案 1 :(得分:2)
在调用fs.exists(p, [callback])
res.render
检查文件是否存在
http://nodejs.org/docs/latest/api/fs.html#fs_fs_exists_path_callback
节点0.6.x及更早
在调用path.exists(p, [callback])
res.render
检查文件是否存在
答案 2 :(得分:1)
与@Augustin Riedinger的答案类似,使用renderFile
渲染变量时同样适用:
var html = jade.renderFile('path/to/file.jade', context, function(err, html) {};
答案 3 :(得分:0)
您可以使用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 });
}
});