如何在NodeJS中捕获错误、自定义错误码并发送至前端避免服务崩溃
Node.js数据库操作错误处理及服务稳定性优化方案
原有代码问题梳理
- 异步回调中直接
throw err没有外层捕获,会直接触发进程崩溃 rows.affectedRows == 0时err为空对象,此时抛出无意义异常- 前后端分离场景下使用
res.redirect会覆盖JSON响应,导致前端无法收到预期返回 - 缺少入参校验逻辑,非法参数直接传入SQL会触发执行异常
1. 自定义错误码返回前端实现
前后端先约定统一响应结构,示例结构如下:
{ code: 200, // 自定义错误码:200成功,400参数错误,404资源不存在,500服务内部错误 msg: "操作成功", // 前端可直接展示的提示信息 data: null // 可选,需要返回给前端的业务数据 }
根据不同的业务场景返回对应结构的JSON即可,不要混用res.redirect和res.json,重定向仅适用于页面跳转类场景,不适用于前后端分离的接口调用。
2. 避免服务器崩溃的核心方案
- 所有异步回调中的错误禁止直接抛出,统一捕获后返回错误响应
- 业务逻辑执行前先做入参合法性校验,拦截非法请求
- 增加全局异常兜底捕获,避免未处理异常直接导致进程退出
修正后的完整代码示例
// 假设待删除的id从请求参数中获取,示例为req.query.id或req.body.id const userId = req.body.users_id; // 第一步:入参校验,拦截非法请求 if (!userId || isNaN(Number(userId))) { return res.json({ code: 400, msg: "缺少合法的用户ID参数", data: null }); } db.getConnection((err, connection) => { if (err) { // 数据库连接失败,返回错误不抛出 return res.json({ code: 500, msg: "数据库连接异常", data: null }); } connection.query( "DELETE FROM users where users_id = ?", [userId], (err, rows) => { connection.release(); // 先捕获SQL执行错误 if (err) { return res.json({ code: 500, msg: "删除操作执行失败", data: null }); } // 判断是否有数据被删除 if (rows.affectedRows == 0) { return res.json({ code: 404, msg: "未找到对应待删除的用户", data: null }); } // 操作成功返回 res.json({ code: 200, msg: "用户删除成功", data: { affectedRows: rows.affectedRows } }); console.log("Daten gelöscht", rows.affectedRows); } ); });
全局异常兜底配置(可选,放在服务入口文件中)
// 捕获未处理的同步抛出异常 process.on('uncaughtException', (err) => { console.error('全局未捕获异常:', err); // 可在此处添加异常日志上报逻辑 }); // 捕获未处理的Promise拒绝异常 process.on('unhandledRejection', (reason) => { console.error('全局未处理Promise拒绝:', reason); });
内容的提问来源于stack exchange,提问作者JrWebDev
相关产品推荐
相关产品推荐

