[Final Project] 8/20 (금)

Steve·2021년 8월 20일
0

Final Project 기록

목록 보기
18/26

오늘 작업 내용

  • DB 문제 해결
  • 앞으로의 기능 방향성 회의
  • 주말동안 할 일 분배

Error: Can't add new command when connection is in closed state 문제를 해결했다. 내가 쓴 코드때문에 해결되었는지는 모르겠지만, 더이상 pool 에 connect 하지 못해서 저 메세지가 뜨는 문제는 없어졌다.

기존 코드는 단순히 pool 을 만들고 export 하는 코드였다.
바뀐 코드는 서버가 실행될 때 만들어진 Pool 이 closed 될 경우 새로운 Pool 을 반환하는 코드다.

const mysql = require('mysql2/promise');
const dotenv = require('dotenv');
dotenv.config();

// 서버가 실행될 때 최초로 한번 만들어지는 pool
let pool = mysql.createPool({
  host: process.env.DATABASE_HOST,
  user: process.env.DATABASE_USER,
  password: process.env.DATABASE_PASSWORD,
  database: process.env.DATABASE_NAME,
  port: process.env.DATABASE_PORT,
  connectTimeout: 10000,
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0,
});
console.log('just created pool');

module.exports = {
  getPool: async function () {
    try {
      // 기존의 pool 에 connect 성공 시 기존 pool 을 반환
      const connection = await pool.getConnection();
      await connection.beginTransaction();
      console.log('Connected to existing pool.');
      connection.release();
      return pool;
    } catch (err) {
      try {
        // connect 에 실패 시 새로운 pool 을 만듦
        console.log('Failed to begin transaction.', err);
        await pool.end();
        console.log('Destroyed existing pool');
      } catch (err1) {
        console.log('Failed to end existing pool', err1);
      } finally {
        console.log('Creating a new pool...');
        let newPool = mysql.createPool({
          host: process.env.DATABASE_HOST,
          user: process.env.DATABASE_USER,
          password: process.env.DATABASE_PASSWORD,
          database: process.env.DATABASE_NAME,
          port: process.env.DATABASE_PORT,
          connectTimeout: 10000,
          waitForConnections: true,
          connectionLimit: 10,
          queueLimit: 0,
        });
        // pool 을 갱신시키고 return
        pool = newPool;
        console.log('New pool created. Returing new pool.');
        return pool;
      }
    }
  },
};

이 문제를 연구하느라 mysql의 module 파일을 하나하나 들여다보았다... 힘들었지만 그래도 나름 재미있는 경험이었다. 덕분에 어떤 함수가 promise 를 return 하는 함수인지 알게 되어 적절하게 await 을 붙일 수 있었다.


주말동안 할일

  • 검색기능, 로딩화면
  • iframe 대체 이미지
  • wordcloud 어떻게 구현할지 조사
profile
게임과 프론트엔드에 관심이 많습니다.

0개의 댓글