2023. 5. 30. 17:04ㆍInternational Sign Lang 프로젝트/트러블슈팅
위 글에서 파생된 에러에 대한 설명하는 글입니다!
꼭 읽고 와주시면 감사하겠습니다!
발생 원인
문제가 발생한 코드부터 바로 보겠습니다!
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 모듈이 오래되기는 했구나...
그러면 다른 솔루션을 찾아야 하네라고 생각을 하던 와중에 다음 글을 찾았다.
정확히 나의 상황과 비슷했다.
원인은 나오지 않았지만, mysql 라이브러리를 mysql2로 교체하면 해결이 된다는 것!
mysql2 란?
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 패키지가 최신화 된 것이라고 근거없이 생각했던 나 자신에 대한 반성.
내가 선택하는 기술들에 있어 항상 자신감과 동시에 틀릴 수도 있다는 마음을 가지자는 생각을 다시 한번 했다.