求教当express 在render时候出现错误时,怎样用Nodejs捕获并处理呢?

求教当express 在render时候出现错误时,怎样用Nodejs捕获并处理呢?

目前遇到一个问题,就是在 render 将数据绑定到页面模板时候,可能会出现异常,然后异常堆栈信息就通过express直接显示在浏览器里了, 这样很不友好,我想统一处理这类 绑定数据的异常,然后跳到指定的错误提示页面。求教应该怎样处理呢?

3 回复

当然可以!在Express应用中,当你使用res.render()方法渲染模板时,如果出现错误,Express会默认将错误堆栈信息直接返回给客户端。为了更友好的用户体验,我们可以捕获这些错误,并重定向到一个自定义的错误页面。

示例代码

首先,确保你已经安装了Express库:

npm install express

接下来,我们创建一个简单的Express应用来演示如何捕获和处理渲染模板时的错误:

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.use((req, res, next) => {
    try {
        next();
    } catch (error) {
        res.status(500).render('error', { message: error.message });
    }
});

// 路由处理
app.get('/', (req, res) => {
    // 故意引发错误
    res.locals.user = undefined; // 这里会导致错误
    res.render('index'); // 渲染模板
});

// 错误处理中间件
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).render('error', { message: '发生了一个未知错误' });
});

// 启动服务器
app.listen(3000, () => {
    console.log('Server is running on http://localhost:3000');
});

解释

  1. 设置视图引擎:这里使用EJS作为视图引擎。
  2. 中间件捕获错误:在路由之前添加一个中间件,它会捕获任何在渲染模板过程中抛出的错误,并将其渲染到一个名为error.ejs的错误页面。
  3. 故意引发错误:在路由处理函数中,我们故意引发一个错误(例如,尝试访问未定义的对象属性)。
  4. 错误处理中间件:这是Express的一个内置功能,允许你在全局范围内捕获并处理所有未被其他中间件捕获的错误。在这个例子中,我们将错误信息渲染到error.ejs页面。

自定义错误页面

创建一个名为error.ejs的文件,路径为views/error.ejs,内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Error</title>
</head>
<body>
    <h1><%= message %></h1>
</body>
</html>

这样,当渲染模板时发生错误,用户将看到一个友好的错误页面,而不是复杂的错误堆栈信息。


目前解决方式是:直接改了 express 的源码 application.js 的render 方法,catch里 直接this.render(‘others/error’, options, fn)。。。。

当使用 Express 进行渲染时,如果发生错误,你可以通过设置错误处理中间件来捕获并处理这些错误。错误处理中间件允许你在请求生命周期的最后阶段处理错误。

示例代码

const express = require('express');
const app = express();

// 设置一个错误处理中间件
app.use((err, req, res, next) => {
    console.error(err.stack); // 打印错误堆栈到控制台
    res.status(500).render('error', { message: '发生了内部服务器错误' }); // 渲染错误页面
});

// 示例路由
app.get('/', (req, res) => {
    try {
        // 模拟一个可能抛出错误的操作
        throw new Error('这是一个测试错误');
    } catch (err) {
        next(err); // 将错误传递给错误处理中间件
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 错误处理中间件:定义一个错误处理中间件函数,该函数接收四个参数 (err, req, res, next)。这个函数专门用于处理在请求过程中抛出的错误。
  2. 打印错误堆栈:在控制台中打印错误堆栈信息,便于调试。
  3. 渲染错误页面:将错误信息渲染到指定的错误页面(例如 error 模板),而不是直接显示错误堆栈信息。
  4. 传递错误:在路由处理函数中,通过调用 next(err) 将错误传递给错误处理中间件。

这种方法可以帮助你更好地管理错误,并提供友好的用户界面反馈。

回到顶部