节点mysql2 async-await尝试捕获

时间:2018-10-09 09:46:29

标签: node.js promise async-await node-mysql2

我的问题是关于处理Node.js中异步等待mysql查询中的错误。我正在使用mysql promise包装器在nodejs中创建连接池。

const mysql = require('mysql2/promise');

const pool = mysql.createPool({
host: '192.168.0.1',
  user: 'root',
  database: 'h2biz_18_dev',
  waitForConnections: true,
  connectionLimit: 100,
  queueLimit: 0,
  password : 'abc'
})

内部catch块连接释放无法调用,因为抛出错误

Cannot read property 'release' of undefined

如果查询执行引发错误,是否需要在catch块中释放连接?如果是这样,使用mysql2在异步等待中释放连接并捕获错误的正确方法是什么?

router.post('/getHolidaysOfYear',async function (req, res, next) {      
    var conn;

try{
    conn = await pool.getConnection();
        // Do something with the connection
    var promise1 = conn.execute(`
    SELECT 
        CALENDAR.*
    FROM
        hrm_calendar_holiday_policy1 CALENDAR
    `);
    const values = await Promise.all([promise1]);
    conn.release();
    return res.status(200).send({success:true, data:values[0][0]});
}

catch(err){
    logger.error(API_NAME + 'error :' + err);
    conn.release();
    return res.status(500).send({success:false, message:'Query Error'});
}
});

1 个答案:

答案 0 :(得分:2)

conn初始化之前似乎发生了错误,所以在pool.getConnection();内部。

因此,在您的catch块中,变量conn为空,因此不能/不必释放它。

您可以执行以下操作:

catch(err){
    logger.error(API_NAME + 'error :' + err);
    if(conn !== undefined) //This will check if the conn has already be initialized
        conn.release();
    return res.status(500).send({success:false, message:'Query Error'});
}