1
1
import Koa from "koa"
2
2
import Router from "@koa/router"
3
3
import bodyParser from "koa-bodyparser"
4
- import mysql , { Connection } from "mysql"
4
+ import mysql from "mysql"
5
5
import mysql2 from "mysql2"
6
6
7
7
const mysqlConfig = {
@@ -11,6 +11,68 @@ const mysqlConfig = {
11
11
database : process . env . MYSQL_DATABASE
12
12
}
13
13
14
+ type MaybeMysqlError = mysql . MysqlError | mysql2 . QueryError | null | undefined
15
+
16
+ interface MysqlConnection {
17
+ connect ( callback : ( err : MaybeMysqlError ) => void ) : void
18
+ query (
19
+ sql : string ,
20
+ callback : ( err : MaybeMysqlError , rows : any , fields : any ) => void
21
+ ) : void
22
+ end ( callback : ( err : MaybeMysqlError ) => void ) : void
23
+ }
24
+
25
+ function connectionPromise ( mysqlClient : MysqlModule ) : Promise < MysqlConnection > {
26
+ return new Promise ( ( resolve , reject ) => {
27
+ const connection = mysqlClient . createConnection ( mysqlConfig )
28
+
29
+ connection . connect ( ( err : MaybeMysqlError ) => {
30
+ if ( err ) reject ( err )
31
+ resolve ( connection )
32
+ } )
33
+ } )
34
+ }
35
+
36
+ function dummyQueryPromise ( connection : MysqlConnection ) : Promise < any > {
37
+ return new Promise ( ( resolve , reject ) => {
38
+ connection . query (
39
+ "SELECT 1 + 1 AS solution" ,
40
+ ( err : MaybeMysqlError , rows : any , _fields : any ) => {
41
+ if ( err ) reject ( err )
42
+ try {
43
+ resolve ( rows [ 0 ] . solution )
44
+ } catch ( err ) {
45
+ reject ( err )
46
+ }
47
+ }
48
+ )
49
+ } )
50
+ }
51
+
52
+ function endConnectionPromise ( connection : MysqlConnection ) : Promise < void > {
53
+ return new Promise < void > ( ( resolve , reject ) => {
54
+ connection . end ( ( err : MaybeMysqlError ) => {
55
+ if ( err ) reject ( err )
56
+ resolve ( )
57
+ } )
58
+ } )
59
+ }
60
+
61
+ async function dummyQuery ( mysqlClient : MysqlModule ) : Promise < any > {
62
+ const connection = await connectionPromise ( mysqlClient )
63
+ const result = await dummyQueryPromise ( connection )
64
+ await endConnectionPromise ( connection )
65
+
66
+ return result
67
+ }
68
+
69
+ interface MysqlModule {
70
+ createConnection ( config : typeof mysqlConfig ) : MysqlConnection
71
+ }
72
+
73
+ const mysqlModule : MysqlModule = mysql
74
+ const mysql2Module : MysqlModule = mysql2
75
+
14
76
const app = new Koa ( )
15
77
const router = new Router ( )
16
78
const port = process . env . PORT
@@ -26,32 +88,17 @@ router.get("/error", async (_ctx: any) => {
26
88
} )
27
89
28
90
router . get ( "/mysql-query" , async ( ctx : any ) => {
29
- await dummyQuery ( mysql )
91
+ await dummyQuery ( mysqlModule )
30
92
31
93
ctx . body = "MySQL query received!"
32
94
} )
33
95
34
96
router . get ( "/mysql2-query" , async ( ctx : any ) => {
35
- await dummyQuery ( mysql2 )
97
+ await dummyQuery ( mysql2Module )
36
98
37
99
ctx . body = "MySQL2 query received!"
38
100
} )
39
101
40
- function dummyQuery ( mysqlClient : any ) {
41
- let connection : Connection
42
-
43
- return new Promise ( ( resolve , reject ) => {
44
- connection = mysqlClient . createConnection ( mysqlConfig )
45
-
46
- connection . connect ( )
47
-
48
- connection . query ( "SELECT 1 + 1 AS solution" , ( err , rows , _fields ) => {
49
- if ( err ) reject ( err )
50
- resolve ( rows [ 0 ] . solution )
51
- } )
52
- } ) . finally ( ( ) => connection . end ( ) )
53
- }
54
-
55
102
app . use ( router . routes ( ) ) . use ( router . allowedMethods ( ) )
56
103
57
104
app . listen ( port )
0 commit comments