ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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();를 호출하여 해결하였습니다.

    댓글

Designed by black7375.