Node.js使用mysql2连接池时beginTransaction不是函数的问题求助
解决mysql2连接池下async/await事务调用报错问题
你遇到的is not a function错误,根源是事务必须基于单个数据库连接执行,而你直接调用连接池(con.promise())的beginTransaction方法——连接池本身并没有这个方法,只有单个连接对象才有。
下面是修改后的完整代码,核心是先从连接池获取单个连接,再基于这个连接做事务操作:
const mysql = require('mysql2'); const errorCodes = require('source/error-codes'); const PropertiesReader = require('properties-reader'); const prop = PropertiesReader('properties.properties'); const con = mysql.createPool({ connectionLimit : 10, host: prop.get('server.host'), user: prop.get("server.username"), password: prop.get("server.password"), port: prop.get("server.port"), database: prop.get("server.dbname") }); exports.checkInvestorBoost = async (event, context) => { context.callbackWaitsForEmptyEventLoop = false; con.config.namedPlaceholders = true; const params = event.queryStringParameters; if (!params || params.iduser == null) { return errorCodes.not_null_parameters; } if(isNaN(params.iduser)) { return errorCodes.missing_fields; } const iduser = Number(params.iduser); const toDate = new Date(); let connection; console.log("iduser: " + iduser); let sql = "SELECT * FROM golden_circle_member WHERE iduser= :iduser AND is_investor_boost = true AND to_date > :to_date"; try { // 1. 从连接池获取单个连接 connection = await con.promise().getConnection(); // 2. 基于单个连接开启事务 await connection.beginTransaction(); const [data, meta] = await connection.query(sql, { iduser: iduser, to_date: toDate }); // 3. 提交事务 await connection.commit(); const output = data.length > 0; return { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": JSON.stringify({ "is_investor_boost": output }), "isBase64Encoded": false }; } catch (error) { console.log(error); // 出错时回滚事务 if (connection) await connection.rollback(); return errorCodes.internal_server_error; } finally { // 4. 无论成功失败,都释放连接回池 if (connection) connection.release(); } };
关键改动说明
- 新增
let connection变量存储单个连接 - 用
await con.promise().getConnection()从连接池获取可用连接 - 所有事务相关操作(
beginTransaction、query、commit、rollback)都基于这个connection对象执行 - 新增
finally块确保连接一定会被释放,避免连接池耗尽 - 错误处理中增加事务回滚逻辑,保证数据一致性
内容的提问来源于stack exchange,提问作者PeakGen
相关产品推荐
相关产品推荐

