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

解释

  1. 设置模板引擎:在这个例子中,我们使用了 EJS 作为模板引擎,但你可以根据需要选择其他模板引擎。
  2. 路由处理:当接收到 GET 请求时,尝试渲染指定路径的视图。如果渲染过程中出现错误,则通过 res.redirect('/error-page') 进行重定向。
  3. 错误处理中间件:全局错误处理中间件用于捕获未处理的错误并提供统一的错误响应。这里我们渲染了一个名为 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');
});

解释:

  1. 路由处理:在路由处理函数中,我们使用了try...catch来捕获可能发生的错误。
  2. 错误传递:如果res.render调用失败并抛出异常,我们将该异常传递给下一个中间件(通过next(err))。
  3. 错误处理中间件:定义了一个错误处理中间件,它接收四个参数(err, req, res, next),这是Express框架用来处理错误的标准方式。在这个中间件中,你可以选择渲染一个错误页面或执行其他操作。

这样,当res.render失败时,Express将跳转到错误处理中间件,并在那里执行适当的逻辑(如渲染错误页面)。

回到顶部