MYSQL : Error: Cannot enqueue Handshake after already enqueuing a Handshake.

2023. 11. 15. 16:41우당탕탕 에러기록

구글 애널리틱스로부터 fatching한 데이터를 . 디비에 넣어서 관리하고싶은데 백엔드 팀원이 없기때문에 직접 노드서버에 DB를 붙이는 과정에서 겪은 에러이다.

대충 해석해보면 "핸드쉐이크가 가득 차 있는데, 그 후에 또 핸드쉐이크를 채울 순 없다."

음... 나 배부른데 또 뭘 먹이려고? 라는 뉘앙스이다.

아마도 내가 한번이면 되는 걸 처리가 되기전에 너무 빨리요청하거나 혹은, 두번 요청한다는 느낌이다.

아니나 다를까 다른 사람들의 트러블슈팅 기록을 보니 DB connection이 중복으로 호출된게 문제였다.

//sql 연결하기
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'drrsrd0330^^',
  database: 'Moa'
});

이 코드블럭에서 sql에 연결을 완료했으나 이후 코드에서

// 테스트용 더비데이터
function addDummyData() {
  const dummyData = [
    { visit_date: '2023-11-13', visitors: 2300 },
    { visit_date: '2023-11-08', visitors: 600 },
    { visit_date: '2023-11-11', visitors: 100 }
    // 추가하고자 하는 더미 데이터 계속 추가
  ];
  // INSERT INTO 쿼리 실행
  dummyData.forEach((data) => {
    connection.query(
      'INSERT INTO visitor_Data ( visit_date, visitor) VALUES ( ?, ?)',
      [data.visit_date, data.visitors],
      (error, results, fields) => {
        if (error) {
          console.error('데이터 추가 오류: ' + error.message);
        } else {
          console.log('데이터 추가 성공! :' + results[0]);
        }
      }
    );
  });
}
// 구글 로그인 응답
app.post('/accessToken', async (req, res) => {
  try {
    const { accessToken } = req.body; // 클라이언트에서 POST 요청 본문에 포함된 액세스 토큰 추출
    connection.connect((err) => {
      if (err) {
        console.error('MySQL 연결 오류: ' + err.stack);
        return;
      }
      console.log('MySQL 연결 ID: ' + connection.threadId);
      addDummyData();
    });

이렇듯 구글 로그인이 완료되면 또 한번 connect()를 통해 연결이 된 상태에서 호출했기 떄문에 위와같은 에러가 발생했다고볼 수 있다.

일반적으로 MySQL 연결은 한 번만 수립되어야 하며, 이후에는 연결을 계속 사용하거나 필요에 따라서는 end()를 호출하여 연결을 종료한 후 새로운 연결을 시도해야 한다.

//중복호출을 수정 한 코드
app.post('/accessToken', async (req, res) => {
  try {
    const { accessToken } = req.body; // 클라이언트에서 POST 요청 본문에 포함된 액세스 토큰 추출
    addDummyData();

위와같이 수정했더니 "Error: Cannot enqueue Handshake after already enqueuing a Handshake." 가 해결되었다.


배운 점

mysql을 처음사용하다보니 , 

const connection = mysql.createConnection()

connection.connect()

이 두 가지가 같은 역할을 한다는걸 이런 에러를 만나고 찾아보기 전까지는 전혀 알지 못했다.

차라리 도입단계에서 이런 에러를 만나는게 더 성장에 도움되는 것 같다.