를 하고 싶었으나 에러가 떴다.
npm install express-mysql-session --save
https://www.npmjs.com/package/express-mysql-session
Client does not support authentication protocol requested by server;
라는 에러가 떴다,,
검색을 해보니 2017년부터 node v16과 mysql v8 은 서로 연동이 안됐다...
mysql.8.0 에서는 다양한 플러그 형태의 인증 방법을 제공한다.
기본적으로 제공하는 인증 방법은 caching_sha2_password이다.
내가 설치한 node.js v16이 caching_sha2_password 인증 방법은 지원하지 않기 때문에 mysql_native_password로 변경해주었다.
(mysql 다운 그레이드는 최후의 수단이기에 하고 싶지 않았다.)
변경 전
변경 후
그래도 에러,, 🫣
외부 접속 허용이 되어있는지 확인을 해야한다는 의견이 있어
host에 localhost 이외의 주소를 %로 추가해주었다.
$CREATE USER 'root'@'%' IDENTIFIED BY '비밀번호';
$SELECT host,user,plugin FROM mysql.user;
$ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '비밀번호';
그래도 에러,, 🫣
DB에 권한 부여...
$GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
$FLUSH PRIVILEGES;
% 라는 host 이름을 인식하지 못했고..
외부 주소도 필요한게 아니었다..
app.js 다시 한 번 확인
const MySQLStore = require('express-mysql-session')(session);
const options = {
host: 'host이름',
port: 3306,
user: 'user이름',
password: '비밀번호',
database: 'db이름'
}
const app = express();
const store = new MySQLStore(options);
결론!
1. localhost도 연결 가능했고 (외부 접속뿐만 아니라)
2. plugin을 mysql_native_password로 변경해주고 (mysql 다운 그레이드 대신)
3. 공식문서에 나와있는 설정법을 app.js에 정확히 작성하면 해결 되었다!
https://deeplify.dev/database/troubleshoot/not-support-authentication