我在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");
});