Node.js MySQL操作中回调抛出错误无法被try catch捕获该如何处理
问题根本原因
你遇到的问题本质是异步回调中的错误无法被外层同步try/catch捕获:回调函数会在当前同步栈执行完毕后才触发执行,此时外层的try/catch上下文已经销毁,回调中抛出的错误会成为未捕获异常直接导致进程崩溃。
解决方案
方案1:直接在回调错误分支处理(改造成本最低)
直接在query的回调error分支完成错误响应,不需要抛出错误,不需要依赖外层try/catch:
router.post('/', (req, res) => { const category_name = "Books" const account_id = "6908vbb465789" connection.query( "INSERT INTO category(category_name,account_id) Values(?,?)", [category_name,account_id], function (error, results, fields) { if (error) { // 直接处理错误返回响应,不抛出 return res.status(400).json(error); } res.send({ code: 200 }); }); })
方案2:封装为Promise使用async/await(错误管理更统一)
如果偏好统一用try/catch管理所有业务错误,可以将回调风格的查询方法封装为Promise,配合async/await语法使用,异步错误可以正常被try/catch捕获:
const util = require('util'); // 把callback风格的query转为返回Promise的方法 const query = util.promisify(connection.query).bind(connection); router.post('/', async (req, res) => { try { const category_name = "Books" const account_id = "6908vbb465789" await query( "INSERT INTO category(category_name,account_id) Values(?,?)", [category_name,account_id] ) res.send({ code: 200 }); } catch (e) { res.status(400).json(e); } })
如果使用的是mysql2依赖,本身已经提供了Promise版本的接口,不需要手动封装,直接引入mysql2/promise即可使用。
内容的提问来源于stack exchange,提问作者Anjana
相关产品推荐
相关产品推荐

