-
[sequelize, mysql2] sequelize 사용시 오류 해결 방법programing/Web 2019. 10. 15. 22:50
안녕하세요, Einere입니다.
(ADblock을 꺼주시면 감사하겠습니다.)
이번 포스트에서는 Node.js의 Express와 sequelize를 이용해 mysql에 연결할 때 겪은 에러와 해결방법에 대해 공유하고자 합니다.
not support auth
Client does not support authentication protocol requested by server; consider upgrading MySQL client
연결하려고 할 때 이런 에러가 뜬 적 있으신가요?
이 에러의 원인은 mysql 8.0이상에서 새로운 인증 알고리즘인
caching_sha2_password
를 express측에서 지원하지 않기 때문에 발생합니다. 따라서, 해결방법은 다음과 같습니다.- mysql을 다운그레이드하기
- 옛날 방식으로 인증하도록 허용하기
사실 mysql을 다운그레이드 하자면 재설치 및 세팅이 복잡하므로, 보통 후자의 방법을 추천합니다. 옛날 방식으로 인증하고자 한다면 mysql에 접속하셔서 다음 명령어를 입력하시면 됩니다.
ALTER USER '유저네임'@'호스트' IDENTIFIED WITH mysql_native_password '새 비밀번호'; FLUSH PRIVILEGES;
위 명령어는 특정 유저와 호스트로 인증할 때, 옛날 방식인 mysql_native_password방식으로 로그인하도록 허용한다는 것입니다.
보통 유저네임은 root, 호스트는 localhost입니다만, docker에 mysql에 올리는 경우에는 호스트가 172.17.0.1가 되므로 해당하는 유저를 따로 생성하시던지 %를 이용해서 모든 호스트에 대해 적용하셔야 합니다.
access denied
Access denied for user 'root'@'172.17.0.1' (using password: YES)
위와 같은 에러가 뜬다면, 단순히 비밀번호가 틀렸을 가능성이 높습니다.
not support auth with dotenv
제가 겪은 제일 황당한 오류인데요, 바로 dotenv의 실행 시점과 관련된 오류입니다. 더 정확히 말하자면, sequelize객체를 생성(mysql과 연결)할 때
process.env
에 할당된 유저 환경변수들이undefined
이여서 첫 번째 오류가 발생했습니다.일반적인 express라면 app.js의 최상단에서
require('dotenv').config();
를 호출하면 됩니다만, 제 경우에는 graphql-yoga라는 라이브러리를 사용했기 때문에 실행 순서가 이상했습니다.// entry point // index.js require('dotenv').config(); import {GraphQLServer} from 'graphql-yoga'; import {resolvers} from './graphql/resolvers'; import {db} from './database'; const server = new GraphQLServer({ typeDefs: "./graphql/schema.graphql", resolvers }); server.start(() => { console.log('graphQL server is running!'); });
엔트리포인트인 index.js는 위와 같습니다.
// ./database/index.js import { Sequelize, DataTypes } from 'sequelize'; import {userModel} from "./model/userModel"; import {roomModel} from "./model/roomModel"; import {reservationModel} from "./model/reservationModel"; const sequelize = new Sequelize(process.env.DB_DATABASE, process.env.DB_USER, process.env.DB_USER_PASSWORD, { dialect: 'mysql', host: process.env.DB_HOST, port: process.env.DB_PORT, pool: { max: 5, min: 0, acquire: 30000, idle: 10000 } });
그리고 문제의 발원지인 database/index.js는 위와 같습니다.
express라면 당연히 엔트리포인트 최상단이 먼저 호출되는 게 당연합니다만, graphql-yoga는 express를 한번 래핑한 라이브러리기 때문인지
require('dotenv').config();
가 호출되기 전에 database/index.js가 먼저 호출되어서new Sequelie()
의 인자로undefined
들이 들어갔습니다..그래서 결국 database/index.js의 최상단에서
require('dotenv').config();
를 호출하여 해결하였습니다.'programing > Web' 카테고리의 다른 글
[Cache] 웹 브라우저의 캐시를 사용하지 않도록 하는 방법 (0) 2019.12.21 [passport] DNS를 이용하여 배포환경에서 OAuth 사용하기 (0) 2019.11.19 [Vue.js] props로 받은 데이터를 data로 사용하기 (0) 2019.10.10 [NCloud] Naver NCloud로 Express서버 배포하기 - 2 (0) 2019.10.05 [NCloud] Naver NCloud로 Express서버 배포하기 - 1 (0) 2019.10.05 댓글