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}`);
});

解释

  1. 设置视图引擎:

    • app.set('views', path.join(__dirname, 'views')) 设置了视图模板文件的目录。
    • app.set('view engine', 'ejs') 设置了视图引擎为 EJS。
  2. 路由定义:

    • 在路由处理函数中,我们使用 try...catch 结构来包裹 res.render 调用,以捕获任何可能抛出的异常。
    • 如果模板不存在或发生其他错误,将进入 catch 块,并返回一个自定义的错误信息。
  3. 错误处理中间件:

    • 使用 app.use() 定义了一个全局错误处理中间件,用于处理所有未被其他中间件捕获的错误。
    • 如果响应头已经发送(即 res.headersSenttrue),则将错误传递给下一个中间件处理。
    • 否则,返回一个友好的错误信息。

这样,即使模板文件不存在,应用也不会崩溃,而是返回一个友好的错误页面给用户。


先用 fs.existsSync 判断一下是否存在,再决定是否 render

直接TRY一下 根据异常跳转

异步地try是判断error

res.render('index.ejs',{ title: "index" },function(err,result){
    if(err) return res.end("木有模板呀...")
	res.end(result)
})

Node.js Express 中 res.render 的异常处理

在使用 Express 的 res.render 方法来渲染模板时,如果模板文件不存在,Express 会抛出一个错误。为了捕获这种异常并进行适当的处理,你可以使用中间件来捕获这些错误。

示例代码

  1. 安装依赖: 确保你已经安装了 expressejs

    npm install express ejs
    
  2. 创建基本的 Express 应用: 创建一个简单的 Express 应用来演示如何捕获模板渲染时的异常。

    const express = require('express');
    const app = express();
    
    // 设置模板引擎为 EJS
    app.set('view engine', 'ejs');
    
    // 路由处理
    app.get('/', (req, res) => {
      try {
        // 尝试渲染不存在的模板
        res.render('nonexistent-template');
      } catch (error) {
        // 捕获异常并返回自定义错误页面
        console.error(error);
        res.status(500).send('An error occurred while rendering the template.');
      }
    });
    
    // 启动服务器
    app.listen(3000, () => {
      console.log('Server is running on port 3000');
    });
    
  3. 添加错误处理中间件: 使用 Express 的错误处理中间件来捕获所有未捕获的异常。

    app.use((err, req, res, next) => {
      console.error(err.stack);
      res.status(500).send('Something broke!');
    });
    

解释

  • app.set('view engine', 'ejs'):设置视图引擎为 EJS。
  • res.render('nonexistent-template'):尝试渲染一个不存在的模板文件,这将抛出一个异常。
  • try...catch:捕获渲染过程中可能出现的异常,并返回自定义的错误消息。
  • 错误处理中间件:通过 app.use 添加错误处理中间件,可以捕获所有未处理的异常,并返回统一的错误响应。

通过这种方式,你可以优雅地处理模板渲染过程中可能出现的异常,确保应用不会因为这些异常而崩溃。

回到顶部