我有一个创建条目的mysql语句,它具有一个path()
函数和一个.then
函数,但是当发生以下错误时:
.catch
服务器崩溃,而不是回答TypeError('Bind parameters must not contain undefined. To pass SQL NULL specify JS null');
函数中定义的500
注意:我正在使用带有承诺(.catch
)的npm中的mysql2
库
这是调用它的代码(require('mysql2/promise');
是req.params.account_name
):
undefined
答案 0 :(得分:1)
mysqlConnectionPool.execute
在创建承诺之前 引发异常。
即不会从诺言中抛出异常。
要捕获它,您需要在对try {} catch (e) {}
的调用中mysqlConnectionPool.execute
。
答案 1 :(得分:1)
实际上,@ Quentine接近正确的事情……
这是mysql2
中的一个错误,
我之所以使用sort-of,是因为https://github.com/sidorares/node-mysql2/issues/902表示mysql2
的开发团队还可以。
mysql2.pool将调用传递给已创建的连接的方式存在问题,该方式不会将异常传递给包装承诺。
我最终制作了自己的包装函数来创建连接+调用执行,并包装在正确的promise处理中。
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);
});
});
}
答案 2 :(得分:0)
好吧
我猜您正在使用似乎不支持Promises的标准mysql包,相反,它接受了标准节点回调function(err, results, fields) {}
作为execute方法的参数。
因此,由于您尚未定义有效的回调,因此脚本只会引发异常。