I have a problem. In my NodeJS code, I have executed queries successfully, but now I am trying to work with transactions, but I get an error. Here is the code:
db.js:
require('dotenv').config({ path: 'src/api/v1/.env' });
const mysql = require('mysql2');
const pool = mysql.createPool({
connectionLimit: 10,
host: process.env.DB_HOST,
user: process.env.DB_USER,
database: process.env.DB_NAME,
password: process.env.DB_PASSWORD,
})
module.exports = pool.promise();
transaction.js
const db = require('../../config/db');
function updateDatabaseOrderExecution(order, marketWallet, coinWallet) {
return new Promise((resolve, reject) => {
db.getConnection().then((err, connection) => {
console.log(err)
if (err) {
return reject("Error occurred while getting the connection");
}
connection.beginTransaction(err => {
if (err) {
connection.release();
return reject("Error occurred while creating the transaction");
}
return connection.query(
Wallet.getSaveQuery(), [Wallet.objectToArray(marketWallet)], (err) => {
if (err) {
connection.rollback(() => {
connection.release();
return reject("Failed updating market wallet", err)
});
}
connection.query(
Wallet.getSaveQuery(), [Wallet.objectToArray(coinWallet)], (err) => {
if (err) {
connection.rollback(() => {
connection.release();
return reject("Failed updating coinWallet");
});
}
connection.query(
Order.getSaveQuery(), [Order.objectToArray(order)], (err) => {
if (err) {
connection.rollback(() => {
connection.release();
return reject("Failed inserting order");
});
}
connection.commit((err) => {
if (err) {
connection.rollback(() => {
connection.release();
return reject("Commit failed");
});
}
connection.release();
return resolve({ message: "Order is executed", order})
});
})
});
})
});
});
});
}
When I call this function, the code crashes on the first error of db.getConnection()
:
PromisePoolConnection {
_events: [Object: null prototype] {
newListener: [Function (anonymous)],
removeListener: [Function (anonymous)]
},
_eventsCount: 2,
_maxListeners: undefined,
connection: PoolConnection {
_events: [Object: null prototype] { end: [Function], error: [Array] },
_eventsCount: 2,
_maxListeners: undefined,
config: ConnectionConfig {
isServer: undefined,
stream: undefined,
host: 'localhost',
port: 3306,
localAddress: undefined,
socketPath: undefined,
user: 'alexander',
password: 'abcdefghijk',
passwordSha1: undefined,
database: 'personal',
connectTimeout: 10000,
insecureAuth: false,
supportBigNumbers: false,
bigNumberStrings: false,
decimalNumbers: false,
dateStrings: false,
debug: undefined,
trace: true,
stringifyObjects: false,
enableKeepAlive: false,
keepAliveInitialDelay: 0,
timezone: 'local',
queryFormat: undefined,
pool: [Pool],
ssl: false,
multipleStatements: false,
rowsAsArray: false,
namedPlaceholders: false,
nestTables: undefined,
typeCast: true,
maxPacketSize: 0,
charsetNumber: 224,
compress: false,
authPlugins: undefined,
authSwitchHandler: undefined,
clientFlags: 11203535,
connectAttributes: undefined,
maxPreparedStatements: 16000
},
stream: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: 'tohatsu.lava',
_readableState: [ReadableState],
_events: [Object: null prototype],
_eventsCount: 4,
_maxListeners: undefined,
_writableState: [WritableState],
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: null,
_server: null,
[Symbol(async_id_symbol)]: 7,
[Symbol(kHandle)]: [TCP],
[Symbol(kSetNoDelay)]: false,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(kCapture)]: false,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0
},
_internalId: 0,
_commands: Denque {
_head: 1,
_tail: 1,
_capacity: undefined,
_capacityMask: 3,
_list: [Array]
},
_command: undefined,
_paused: false,
_paused_packets: Denque {
_head: 0,
_tail: 0,
_capacity: undefined,
_capacityMask: 3,
_list: [Array]
},
_statements: LRUCache {
[Symbol(max)]: 16000,
[Symbol(lengthCalculator)]: [Function: naiveLength],
[Symbol(allowStale)]: false,
[Symbol(maxAge)]: 0,
[Symbol(dispose)]: [Function: dispose],
[Symbol(noDisposeOnSet)]: false,
[Symbol(updateAgeOnGet)]: false,
[Symbol(cache)]: Map(0) {},
[Symbol(lruList)]: [Yallist],
[Symbol(length)]: 0
},
serverCapabilityFlags: 2176841726,
authorized: true,
sequenceId: 14,
compressedSequenceId: 0,
threadId: 663,
_handshakePacket: Handshake {
protocolVersion: 10,
serverVersion: '5.5.5-10.3.34-MariaDB-0ubuntu0.20.04.1-log',
capabilityFlags: 2176841726,
connectionId: 663,
authPluginData1: <Buffer 51 27 6c 6c 5b 60 52 5b>,
authPluginData2: <Buffer 50 60 71 39 65 74 35 4a 55 4d 61 23 00>,
characterSet: 8,
statusFlags: 2,
autPluginName: 'mysql_native_password'
},
_fatalError: null,
_protocolError: null,
_outOfOrderPackets: [],
clientEncoding: 'utf8',
packetParser: PacketParser {
buffer: [],
bufferLength: 0,
packetHeaderLength: 4,
headerLen: 0,
length: 5,
largePacketParts: [],
firstPacketSequenceId: 0,
onPacket: [Function (anonymous)],
execute: [Function: executeStart],
_flushLargePacket: [Function: _flushLargePacket4]
},
serverEncoding: 'latin1',
connectTimeout: null,
_pool: Pool {
_events: [Object: null prototype] {},
_eventsCount: 0,
_maxListeners: undefined,
config: [PoolConfig],
_allConnections: [Denque],
_freeConnections: [Denque],
_connectionQueue: [Denque],
_closed: false,
[Symbol(kCapture)]: false
},
connectionId: 663,
[Symbol(kCapture)]: false
},
Promise: [Function: Promise],
[Symbol(kCapture)]: false
}
The credentials are correct, because I can execute other queries successfully. I got the code from: https://stackoverflow.com/a/45285300/10673107. The only difference is that he uses mysql
and I use mysql2
, but in both versions the getConnection()
function exists... What am I doing wrong?