try/catch 块无法阻止ER_DUP_ENTRY错误使我的应用程序崩溃



我在mysql表中添加了一个重复项,我想用Try/Catch块处理引发的ER_DUP_ENTRY错误,但它只是崩溃了,有什么可能的方法可以处理错误并使用Try/Catch块阻止应用程序崩溃吗?

async function init() {
try {
connection.query(
'SOME INSERT QUERY',
(err, result, feilds) => {
if (err) throw err
console.log(result);
}
);
} catch (e) {
console.log(e);
}
}
init(); 

节点mysql库不支持开箱即用的promise,这意味着query不会返回您可以等待的promise。因此,您可以自己将query函数封装在promise中:

async function init() {
try {
const duplicateResult = await new Promise((resolve, reject) => {
connection.query(
'SOME INSERT QUERY',
(err, result, fields) => {
if (err) {
return reject(err);
}
resolve(result);
});
});
} catch (e) {
console.log(e);
}
}

或者使用util.promisify作为Always Learning发布。

问题是connection.query立即返回undefined。您的catch没有参与,因为调用在工作完成之前结束,稍后将调用回调函数。回调期间发生的异常为时已晚。您的try/catch块已完成。

您可以使用promisify这样等待:

const util = require("util");
function init() {
const queryPromise = util.promisify(connection.query);
return queryPromise('SOME INSERT QUERY')
.catch(e => {
console.log("It failed", e);
});
}
init().then(result => {
if (result) console.log("It worked", result);
else console.log("Aww, it didn't work");
}); 

相关内容

最新更新