[英]why does this mysql error causes nodejs to crash instead of going to the catch function?
我有一个创建的条目的MySQL的声明,它有一个.then
功能和.catch
功能,但是当出现以下错误:
TypeError('Bind parameters must not contain undefined. To pass SQL NULL specify JS null');
服务器崩溃而不是像.catch
函数中定义的那样回答 500
注意:我正在使用 npm 中的mysql2
库和承诺( require('mysql2/promise');
)
这是调用它的代码( req.params.account_name
undefined
):
const CREATE_ACCOUNT_STATEMENT =
'INSERT INTO `Accounts` (`account_token`, `account_name`) VALUES (?, ?)'
try {
mysqlConnectionPool.execute(CREATE_ACCOUNT_STATEMENT, [
account_token, account_name
])
.then(() => {
res.end(JSON.stringify({ token: account_token }))
})
.catch((e) => {
debug(1, "error while trying to create account:", e)
res.status(500).end("Internal Server Error")
})
} catch(e) {
debug(1, "error while trying to create account:", e)
res.status(500).end("Internal Server Error")
}
mysqlConnectionPool.execute
在创建承诺之前抛出异常。
即异常不是从承诺中抛出的。
要捕获它,您需要围绕对mysqlConnectionPool.execute
的调用try {} catch (e) {}
。
实际上,@Quentine 接近正确的事情......
这是mysql2
“某种”错误,我使用某种错误,因为https://github.com/sidorares/node-mysql2/issues/902表明mysql2
的开发团队可以接受它。
这是 mysql2.pool 将调用传递给创建的连接的方式的问题,它没有将异常传递给包装承诺。
我最终制作了我自己的包装函数来创建连接 + 调用 execute 包装在正确的承诺处理中。
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);
});
});
}
好,
我猜你正在使用标准的mysql包,它似乎不支持 Promises,相反,它接受一个标准的节点回调function(err, results, fields) {}
作为 execute 方法的参数。
因此,由于您尚未定义有效的回调,脚本只会抛出异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.