Trên thực tế, @Quentine đã gần đúng ...
Đó là "một loại" lỗi trong mysql2
, tôi sử dụng loại vì https://github.com/sidorares/node- mysql2 / issue / 902
đề xuất nhóm phát triển của mysql2
là o.k. với nó.
nó là một vấn đề với cách mysql2.pool chuyển cuộc gọi đến kết nối đã tạo, điều này không chuyển ngoại lệ cho lời hứa gói.
Tôi đã kết thúc việc tạo hàm gói của riêng mình để tạo kết nối + thực thi cuộc gọi được bao bọc trong xử lý lời hứa thích hợp.
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);
});
});
}