Day 10 : MySQL2 오류, "Client does not support authentication protocol requested by server" 해결 방법

2023. 5. 30. 17:04International Sign Lang 프로젝트/트러블슈팅

728x90

 

 

Day 9 : 에러나면 손모가지 날라가붕께

더보기 Day 8 : 가상 DOM 생성, 웹 스크래핑, 및 JSON 데이터 MySQL 저장 (후 많다 많아) Day 7 : 왜 굳이 웹 서버 프레임워크를 사용해야 하나? 2023.05.24 - [Project ISL/프론트엔드] - Day 6 : 첫걸음은 '레이아웃

xpmxf4.tistory.com

위 글에서 파생된 에러에 대한 설명하는 글입니다!

꼭 읽고 와주시면 감사하겠습니다!


발생 원인

문제가 발생한 코드부터 바로 보겠습니다!

const express = require("express")
const mysql = require("mysql2")
const fs = require("fs")
const router = express.Router()

const [host, user, password, database] = fs.readFileSync("database_config.txt", "utf8").split("\n")

const db = mysql.createConnection({
    host,
    user,
    password,
    database,
})

router.post("", function (req, res) {
    const from_country = req.body.from_country
    const to_country = req.body.to_country

    if (from_country.length !== 2 || to_country.length !== 2) {
        return res.status(400).json({
            error: "Invalid country code",
        })
    }

    const query = "INSERT INTO isl (from_country, to_country) VALUES (?, ?)"
    db.query(query, [from_country, to_country], function (err, result) {
        if (err) {
            console.log(err)
            return res.status(500).json({
                error: "Database error",
            })
        }

        res.json({
            message: "Data Received",
            from_country: from_country,
            to_country: to_country,
        })
    })
})

module.exports = router

혹시 이 코드만 보고 문제점을 잡으신 분이 있으실까요...?

있다면 진짜 댓글 좀,,,

 

짧은 기간이었지만 분명히 위 코드는 문제가 없다고 생각했습니다.

하지만 위의 코드를 실행시킨 다음 Postman으로 POST 요청을 날리게 되면

터미널에서 다음과 같은 에러가 나타납니다

분명 문제가 없을 텐데...

엊그제 설치한 MySQL Client를 업그레이드하라고??

 

원인 분석

어이가 없어서 혹시나 하고 npmjs에서 mysql 라이브러리를 찾아봤다.

 

mysql

A node.js driver for mysql. It is written in JavaScript, does not require compiling, and is 100% MIT licensed.. Latest version: 2.18.1, last published: 3 years ago. Start using mysql in your project by running `npm i mysql`. There are 7204 other projects i

www.npmjs.com

출시 3년 전...?

아 mysql 모듈이 오래되기는 했구나...

그러면 다른 솔루션을 찾아야 하네라고 생각을 하던 와중에 다음 글을 찾았다.

 

errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client

I'm creating the simple api project in nodejs. For that I have installed mySql workbench with version 8.0.11. I have created config file, dbConnection.js file and in the dbconnection.js file I have

stackoverflow.com

정확히 나의 상황과 비슷했다.

원인은 나오지 않았지만, mysql 라이브러리를 mysql2로 교체하면 해결이 된다는 것!

mysql2 란?

 

mysql2

fast mysql driver. Implements core protocol, prepared statements, ssl and compression in native JS. Latest version: 3.3.3, last published: 3 days ago. Start using mysql2 in your project by running `npm i mysql2`. There are 3629 other projects in the npm re

www.npmjs.com

MySQL2 project is a continuation of MySQL-Native.
Protocol parser code was rewritten from scratch and api changed to match popular mysqljs/mysql.
MySQL2 team is working together with mysqljs/mysql team to factor out shared code and move it under mysqljs organization.
MySQL2 is mostly API compatible with mysqljs and supports majority of features.
MySQL2 also offers these additional features

Faster / Better Performance
Prepared Statements
MySQL Binary Log Protocol
MySQL Server
Extended support for Encoding and Collation
Promise Wrapper
Compression
SSL and Authentication Switch
Custom Streams
Pooling
[출처] : https://www.npmjs.com/package/mysql2

기존의 mysql 라이브러리보다 훨씬 더 많은 장점들이 존재한다는 설명인데요,

그중에서 제가 눈여겨볼 것은 SSL and Authentication Switch입니다!

 

분명 위에서 보여드린 에러에서는 제 MySQL Client가 인증 프로토콜을 지원을

안 한다라는 에러였는 데 mysql2로 생성한 MySQL Client는 다양한 프로토콜을 지원하기 때문에

에러가 더 이상 나지 않는 거 같아요.

결과물

const express = require("express")
const mysql = require("mysql2")
const fs = require("fs")
const router = express.Router()

const [host, user, password, database] = fs.readFileSync("database_config.txt", "utf8").split("\n")

const db = mysql.createConnection({
    host,
    user,
    password,
    database,
})

router.post("", function (req, res) {
    const from_country = req.body.from_country
    const to_country = req.body.to_country

    if (from_country.length !== 2 || to_country.length !== 2) {
        return res.status(400).json({
            error: "Invalid country code",
        })
    }

    const query = "INSERT INTO isl (from_country, to_country) VALUES (?, ?)"
    db.query(query, [from_country, to_country], function (err, result) {
        if (err) {
            console.log(err)
            return res.status(500).json({
                error: "Database error",
            })
        }

        res.json({
            message: "Data Received",
            from_country: from_country,
            to_country: to_country,
        })
    })
})

module.exports = router

기존의 코드의 상단에서 mysql2를 대신 가져오기만 하면 끝납니다!

 

TIL

아무런 근거 없이 mysql 패키지가 최신화 된 것이라고 근거없이 생각했던 나 자신에 대한 반성.

내가 선택하는 기술들에 있어 항상 자신감과 동시에 틀릴 수도 있다는 마음을 가지자는 생각을 다시 한번 했다.

728x90