Nodejs express render失败后如何跳转到其他页面
Nodejs express render失败后如何跳转到其他页面
module.exports = function(app) { try{ app.get(’/:path/:id’, function (req, res) { res.render(req.params.path+’/’+req.params.id, { id: req.params.id },function(err,html){ if(err) res.send(“PageNotFound.html”); }); });
} catch(e){ console.error(e); }
};
各位大牛,请教一下,res.render如果失败,没有那个页面存在,如何跳到其他页面?
2 回复
当然可以!让我们来改进你的代码,使其在 res.render
失败时能够跳转到一个自定义的错误页面或者进行重定向。我们将使用 res.render
的错误处理机制,并在捕获到错误时执行相应的重定向逻辑。
示例代码
const express = require('express');
const app = express();
// 设置模板引擎(例如 EJS)
app.set('view engine', 'ejs');
app.get('/:path/:id', function (req, res, next) {
const viewPath = `${req.params.path}/${req.params.id}`;
// 尝试渲染视图
res.render(viewPath, { id: req.params.id }, function(err, html) {
if (err) {
console.error('Render error:', err);
// 如果渲染失败,重定向到错误页面
res.redirect('/error-page');
} else {
// 如果渲染成功,发送渲染结果
res.send(html);
}
});
});
// 错误处理中间件
app.use(function(err, req, res, next) {
console.error('Global error handler:', err);
res.status(500).render('error-page', { message: 'An unexpected error occurred.' });
});
// 启动服务器
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
- 设置模板引擎:在这个例子中,我们使用了 EJS 作为模板引擎,但你可以根据需要选择其他模板引擎。
- 路由处理:当接收到 GET 请求时,尝试渲染指定路径的视图。如果渲染过程中出现错误,则通过
res.redirect('/error-page')
进行重定向。 - 错误处理中间件:全局错误处理中间件用于捕获未处理的错误并提供统一的错误响应。这里我们渲染了一个名为
error-page.ejs
的错误页面,并传递了一个错误信息。
注意事项
- 确保你已经在项目中安装了 EJS 模板引擎 (
npm install ejs
)。 - 确保
error-page.ejs
文件存在于你的视图文件夹中。 - 你可以根据需要修改错误页面的内容或状态码。
这样,当 res.render
失败时,用户会被重定向到 /error-page
页面,从而避免了直接显示错误信息给用户。
在Express应用中,当res.render
方法失败时(例如模板文件不存在),默认情况下会抛出一个错误。为了避免这种情况导致服务器崩溃,可以使用中间件来捕获这些错误,并重定向到其他页面。
以下是修改后的示例代码:
const express = require('express');
const app = express();
// 处理路由
app.get('/:path/:id', function (req, res, next) {
try {
const viewPath = `${req.params.path}/${req.params.id}`;
res.render(viewPath, { id: req.params.id });
} catch (err) {
next(err); // 将错误传递给错误处理中间件
}
});
// 错误处理中间件
app.use(function (err, req, res, next) {
console.error(err.stack);
res.status(500).render('errorPage'); // 跳转到错误页面
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释:
- 路由处理:在路由处理函数中,我们使用了
try...catch
来捕获可能发生的错误。 - 错误传递:如果
res.render
调用失败并抛出异常,我们将该异常传递给下一个中间件(通过next(err)
)。 - 错误处理中间件:定义了一个错误处理中间件,它接收四个参数(
err, req, res, next
),这是Express框架用来处理错误的标准方式。在这个中间件中,你可以选择渲染一个错误页面或执行其他操作。
这样,当res.render
失败时,Express将跳转到错误处理中间件,并在那里执行适当的逻辑(如渲染错误页面)。