Sebenarnya, @Quentine mendekati hal yang benar...
Ini adalah "semacam" bug di mysql2
, saya menggunakan sort-of karena https://github.com/sidorares/node- mysql2/issues/902
menyarankan tim pengembangan mysql2
baik-baik saja dengan itu.
ini adalah masalah dengan cara mysql2.pool meneruskan panggilan ke koneksi yang dibuat, yang tidak meneruskan pengecualian ke janji pembungkus.
Saya akhirnya membuat fungsi pembungkus sendiri untuk membuat koneksi + eksekusi panggilan yang dibungkus dengan penanganan janji yang tepat.
import mysql = require('mysql2');
private async queryDB(query:string, useExecute: boolean = false, ...args:any[]) : Promise<any[]>
{
return new Promise<any[]>((resolve, reject)=>{
for(var i = 0; i < args.length; ++i)
{
if(args[i]===undefined)
args[i] = null;
}
this.dbPool.getConnection((err, conn)=>{
if(err){
reject(err);
return;
}
let cb = function(err: mysql.QueryError, results: any[], fields: mysql.FieldPacket[]) {
conn.release();
if(err)
{
reject(err);
return;
}
resolve(results);
}
if(useExecute)
conn.execute(query, args, cb);
else
conn.query(query, args, cb);
});
});
}