UNPKG

mysql-async-wrapper

Version:

This is a Wrapper class, which helps to get rid of callbacks of mysql package functions and provides a way to use them in async await (es7) syntax, Below Examples uses express framework in both (import/export syntax and commonJs syntax)

136 lines (97 loc) 4.32 kB
## Async Mysql Wrapper This is a Wrapper class, which helps to get rid of callbacks of mysql package functions and provides a way to use them in async await (es7) syntax, Below Examples uses express framework in both (import/export syntax and commonJs syntax) It also supports retry query execution for provided error codes Import **BaseDatabase** class from **mysql-async-wrapper**, create a db instance with pool and export it database.js (import/export syntax) ```javascript import mysql from "mysql" import BaseDatabase from "mysql-async-wrapper" const pool = mysql.createPool({ //pool configuration }) const db = new BaseDatabase(pool); export default db; ``` database.js (commonJs Syntax) ```javascript const mysql = require("mysql"); const BaseDatabase = require("mysql-async-wrapper").default; // you need to add default (it's a typescript compiler issue) const pool = mysql.createPool({ //pool configuration }) const db = new BaseDatabase(pool); module.exports = db; ``` to retry query execution in case of error pass configuration object while creating db instance like below ```javascript const maxRetryCount = 3; // Number of Times To Retry const retryErrorCodes = ["ER_LOCK_DEADLOCK", "ERR_LOCK_WAIT_TIMEOUT"] // Retry On which Error Codes const db = new BaseDatabase(pool, { maxRetrCount, retryErrorCodes }) ``` now in api controllers ( route handlers ) ```javascript import db from "database.js"; // const db = require("database.js") in case of commonJS async function controller(req, res, next){ try{ const connetion = await db.getConnection(); const empQuery = `Select * from Employees`; const empResult = await connection.executeQuery(empQuery, []); const deptQuery = `Select * from Departments`; const deptResult = await connection.executeQuery(deptQuery, []); }catch(err){ next(err); }finally{ db.close(); // To Release Connection } } ``` * To begin transaction pass transaction true in options while calling getConnection </br> * Incase of **error** during query executing and connection is in transaction then it will **automatically get rollback** * But To rollback transaction in case of errors other than query errors please use **rollback in catch block** ```javascript import db from "database.js"; async function controller(req, res, next){ try{ const connection = await db.getConnection({ transaction: true }); // Will Begin Transaction const empQuery = `Insert into Employees (EmpID, Name) values (?,?)`; const empResult = await connection.executeQuery(empQuery, ["E02", "Abhay"]); // Incase of error auto rollback of transaction will be done const deptQuery = `Insert into Departments (DeptID, EmpID) values (?,?)`; const deptResult = await connection.executeQuery(deptQuery, ["D01", "E02"]); await db.commit(); }catch(err){ db.rollback(); // to rollback in case of errors other than query error next(err); }finally{ db.close(); } } ``` If Required Transaction can be begin using beginTransaction ```javascript async function controller(req, res, next){ try{ const connection = await db.getConnection(); const getEmpQuery = `Select EmpID, Name from Employees where EmpID = ?`; const getEmpResult = await connection.executeQuery(empQuery, ["E01"]); await db.beginTransaction(); // Will Begin Transaction const empQuery = `Insert into Employees (EmpID, Name) values (?,?)`; const empResult = await connection.executeQuery(empQuery, ["E02", "Abhay"]); const deptQuery = `Insert into Departments (DeptID, EmpID) values (?,?)`; const deptResult = await connection.executeQuery(deptQuery, ["D01", "E02"]); await db.commit(); }catch(err){ db.rollback(); next(err); }finally{ db.close(); } } ``` you can also use retry for specific error codes for particular query only ```javascript const empQuery = `Insert into Employees (EmpID, Name) values (?,?)`; const empResult = await connection.executeQuery(empQuery, ["E02", "Abhay"], ["ER_LOCK_DEADLOCK"]); // by simply passing array of error codes as 3 parameter of execute query ```