Nodejs Express.js 如何屏蔽响应错误
Nodejs Express.js 如何屏蔽响应错误
在写一个小应用,发现访问的时候如果服务端用到了的 POST 或者是 GET 中的变量没有给的话服务器会直接把运行路径响应。
目前尝试过: app.use(express.errorHandler());
domain 模块的方式没太搞明白,但在 PHP 中只需要一句 error_report 就可以搞定了。
当然可以。在使用 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');
});
解释
-
中间件
checkRequiredParams
:- 这个中间件用于检查请求体中是否包含必需的参数(例如
name
和age
)。 - 如果缺少任何必需的参数,则返回一个 400 状态码和相应的错误消息。
- 如果所有必需的参数都存在,则调用
next()
继续处理请求。
- 这个中间件用于检查请求体中是否包含必需的参数(例如
-
错误处理中间件:
- 这是一个通用的错误处理中间件,它会在任何地方抛出错误时被调用。
- 如果发生错误,它会记录错误堆栈并返回一个 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掉
在 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');
});
解释
-
错误处理中间件:
- 错误处理中间件必须具有四个参数
(err, req, res, next)
。 - 当任何地方抛出错误时,Express 会将请求传递给这个中间件进行处理。
- 在这个中间件中,我们可以记录错误(例如打印到控制台),并返回一个友好的错误响应给客户端。
- 错误处理中间件必须具有四个参数
-
路由逻辑:
- 在示例路由中,我们检查
req.query.name
是否存在。如果不存在,我们创建一个新的Error
对象,并将其状态码设置为400
(Bad Request)。 - 然后,我们抛出这个错误,它会被错误处理中间件捕获并处理。
- 在示例路由中,我们检查
通过这种方式,你可以更好地控制应用程序的错误处理逻辑,而不是简单地让错误暴露给客户端。这有助于提高应用程序的安全性和健壮性。