Nodejs express res.render 求助
Nodejs express res.render 求助
目前需要动态render模板,但如果不存在ejs模板时,出错,请问应如何捕获异常??
5 回复
当然可以。在使用 Express 和 EJS 模板引擎时,如果尝试渲染一个不存在的模板文件,可能会导致运行时错误。为了优雅地处理这种情况,你可以通过中间件来捕获这些异常。
以下是一个简单的示例代码,展示了如何捕获并处理 res.render
方法中因模板不存在而引发的错误:
示例代码
const express = require('express');
const path = require('path');
const app = express();
// 设置模板引擎为 EJS
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// 定义一个简单的路由
app.get('/', (req, res) => {
try {
// 尝试渲染一个可能不存在的模板
res.render('index'); // 假设 views/index.ejs 文件可能不存在
} catch (error) {
console.error(error);
// 如果模板不存在,返回一个友好的错误页面或默认页面
res.status(500).send("模板文件未找到或发生错误");
}
});
// 错误处理中间件
app.use((err, req, res, next) => {
if (res.headersSent) {
return next(err);
}
console.error(err);
res.status(500).send("服务器内部错误");
});
// 启动应用
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
解释
-
设置视图引擎:
app.set('views', path.join(__dirname, 'views'))
设置了视图模板文件的目录。app.set('view engine', 'ejs')
设置了视图引擎为 EJS。
-
路由定义:
- 在路由处理函数中,我们使用
try...catch
结构来包裹res.render
调用,以捕获任何可能抛出的异常。 - 如果模板不存在或发生其他错误,将进入
catch
块,并返回一个自定义的错误信息。
- 在路由处理函数中,我们使用
-
错误处理中间件:
- 使用
app.use()
定义了一个全局错误处理中间件,用于处理所有未被其他中间件捕获的错误。 - 如果响应头已经发送(即
res.headersSent
为true
),则将错误传递给下一个中间件处理。 - 否则,返回一个友好的错误信息。
- 使用
这样,即使模板文件不存在,应用也不会崩溃,而是返回一个友好的错误页面给用户。
先用 fs.existsSync 判断一下是否存在,再决定是否 render
直接TRY一下 根据异常跳转
异步地try是判断error
res.render('index.ejs',{ title: "index" },function(err,result){
if(err) return res.end("木有模板呀...")
res.end(result)
})