[NodeJS] Connect MySQL2

이애진·2022년 7월 14일

Node

목록 보기
6/12
post-thumbnail

기존에 사용하던 mysql은 콜백 기반이기 때문에 promise를 사용하지 못하고 promise-mysql 모듈을 따로 설치해서 사용해야한다

하지만, mysql2는 promise를 지원하기 때문에 다른 모듈을 설치하지 않고 사용이 가능하다

기존에 사용했던 connection을 재사용하여 새로운 connection을 구축할 때 생기는 오버헤드를 모두 피해 쿼리 지연시간을 향상시키기 위해 createPool 을 사용한다

pool 은 쿼리가 수행되면 connection은 자동 해제된다

step1. createPool

// mysql/config.ts

import { createPool } from "mysql2/promise";

export default () => {
    const connection = createPool({
        host: process.env.MYSQL_HOST,
        user: process.env.MYSQL_USER,
        password: process.env.MYSQL_ROOT_PASSWORD,
        database: process.env.MYSQL_DATABASE,
        connectionLimit: 30
    });

    return connection;
}

step2. create query

// index.ts

import express, { ErrorRequestHandler, NextFunction, Request, Response } from "express";
import dotenv from "dotenv";
import { FieldPacket, RowDataPacket } from "mysql2/promise";

import pool from "./mysql/config";

dotenv.config();

const app: express.Application = express();

app.use(express.urlencoded({ extended: false }));
app.use(express.json());

const SELECTALL = "select * from TEST";

interface InfoModel extends RowDataPacket {
    Date: string
    Sabun: string
    Entered: string
    Exited: string
}

app.get("/", async (req: Request, res: Response, next: NextFunction) => {
    try {
        const conn = pool();

        const [results]: [InfoModel[], FieldPacket[]] = await conn.query<InfoModel[]>(SELECTALL);

        results.map(r => {
            console.log(r.Date, r.Sabun, r.Entered, r.Exited); // interface가 적용 됐는지 확인하는 용도
        });

        res.json({ results });
    } catch (error) {
        next(Error)
    }
});

app.use(((err, req, res, next) => {
    console.log(err)
}) as ErrorRequestHandler);

app.listen(process.env.NODE_PORT, () => console.log("Running typescript server"));

curl 결과

node log 결과

profile
Frontend Developer

0개의 댓글