如何使用express.js捕获node.js中的渲染错误/缺少模板?
我有这样的代码,可以在没有定义路由的情况下呈现jade模板。可以将其与express.static类似,但它使用url调用res.render如何使用express.js捕获node.js中的渲染错误/缺少模板?,node.js,express,Node.js,Express,我有这样的代码,可以在没有定义路由的情况下呈现jade模板。可以将其与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.lo
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()没有抛出错误。而是呈现一个错误页面。是否有方法检测缺少的模板或任何渲染错误?您可以使用
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 });
}
});
在调用res.render之前,使用fs.exists(p[callback])
检查文件是否存在
节点0.6.x及以上版本
在调用res.render之前,使用path.exists(p[callback])
检查文件是否存在
一个更好的方法是使用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);
}
});
与@Augustin Riedinger的答案类似,当使用以下方法呈现变量时,同样适用:
res.render有一系列逻辑来确定要使用的jade文件。我希望不需要重新创建该逻辑。对于最新(0.8.x)版本的node,您应该使用fs.exists()
Great find。它只存在于3.x文档中,但也适用于2.x。更新了答案以使用res.send
而不是res.end
。4.x文档“如果您需要使用数据进行响应,请改用res.send()等方法。”我认为如果处理模板时出错,这将生成404,但似乎没有。有人想解释一下为什么没有找到吗?404
代码是您的服务器想要回复的请求,告诉查询浏览器找不到该页面。在这一步中,您是服务器,您可以自由地回复任何您想要的内容。如果要发送404错误而不是重定向/404
url,正确的方法是。render中的第二个参数指示什么?我说的是“我的网页不确定它是否存在”之后的“{}”
var html = jade.renderFile('path/to/file.jade', context, function(err, html) {};