Nodejs Express.js 如何屏蔽响应错误

Nodejs Express.js 如何屏蔽响应错误

在写一个小应用,发现访问的时候如果服务端用到了的 POST 或者是 GET 中的变量没有给的话服务器会直接把运行路径响应。

目前尝试过: app.use(express.errorHandler());

domain 模块的方式没太搞明白,但在 PHP 中只需要一句 error_report 就可以搞定了。

6 回复

当然可以。在使用 Node.js 和 Express.js 开发应用程序时,处理错误是非常重要的。默认情况下,Express.js 在发生错误时会自动将错误信息返回给客户端。然而,有时候我们可能希望自定义错误处理逻辑,或者完全屏蔽这些错误信息。

示例代码

假设你有一个简单的 Express.js 应用程序,并且你想要处理那些由于请求中缺少必需参数而引发的错误。

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

// 定义一个中间件来检查必需的参数
function checkRequiredParams(req, res, next) {
    if (!req.body.name || !req.body.age) {
        return res.status(400).json({ error: 'Missing required parameters' });
    }
    next();
}

// 使用中间件
app.use(checkRequiredParams);

// 示例路由
app.post('/submit', (req, res) => {
    const { name, age } = req.body;
    // 处理业务逻辑
    res.json({ message: `Received data for ${name} who is ${age} years old` });
});

// 错误处理中间件
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('Something broke!');
});

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

解释

  1. 中间件 checkRequiredParams:

    • 这个中间件用于检查请求体中是否包含必需的参数(例如 nameage)。
    • 如果缺少任何必需的参数,则返回一个 400 状态码和相应的错误消息。
    • 如果所有必需的参数都存在,则调用 next() 继续处理请求。
  2. 错误处理中间件:

    • 这是一个通用的错误处理中间件,它会在任何地方抛出错误时被调用。
    • 如果发生错误,它会记录错误堆栈并返回一个 500 状态码和错误消息。

通过这种方式,你可以自定义错误处理逻辑,而不是让 Express.js 自动返回默认的错误响应。这样不仅提高了应用程序的安全性,还使得错误处理更加灵活和可控。


Express 的错误回调的是任何 4 个参数的函数。

error_handler = function(err,req,res,next) {
  // handle your error
}
// app.use(...);
app.use(error_handler);

还是会有报错。

如果直接 throw error会出错. 需要通过next传递给路由. 另外, 异步里面的抛错, 还是会传给node, 需要try catch掉

看起来你需要domain和Express的ErrorHandler结合起来使用。

domain的简单demo

var domain = require('domain').create();
domain.on('error', function (err) {  // 没有处理的异常都会被它处理
  console.log('EEE: ' + err);
});

domain.run(function () { var str = null; str.indexOf(‘a’); // TypeError: Cannot call method ‘indexOf’ of null // 会产生 ‘error‘ 事件,进而被domain处理

throw new Error(‘deliberately thrown error’); // Error: deliberately thrown error // 同上 });

如果你打算处理抛出的异常,你可以 try … catch、交给Express的error handler处理等等。

在 Node.js 和 Express.js 中,处理错误通常需要使用中间件来捕获和处理各种类型的错误。express.errorHandler() 是一个旧的方法,不再推荐使用。你可以通过自定义错误处理中间件来实现这一功能。

示例代码

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

// 定义错误处理中间件
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('Something broke!');
});

// 路由示例
app.get('/', (req, res) => {
    if (!req.query.name) {
        // 如果缺少参数,则抛出错误
        const err = new Error('Missing required parameter: name');
        err.status = 400;
        throw err;
    }
    res.send(`Hello ${req.query.name}!`);
});

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

解释

  1. 错误处理中间件:

    • 错误处理中间件必须具有四个参数 (err, req, res, next)
    • 当任何地方抛出错误时,Express 会将请求传递给这个中间件进行处理。
    • 在这个中间件中,我们可以记录错误(例如打印到控制台),并返回一个友好的错误响应给客户端。
  2. 路由逻辑:

    • 在示例路由中,我们检查 req.query.name 是否存在。如果不存在,我们创建一个新的 Error 对象,并将其状态码设置为 400(Bad Request)。
    • 然后,我们抛出这个错误,它会被错误处理中间件捕获并处理。

通过这种方式,你可以更好地控制应用程序的错误处理逻辑,而不是简单地让错误暴露给客户端。这有助于提高应用程序的安全性和健壮性。

回到顶部