ErrorHandling - 환경변수 설정 문제

박재현·2022년 2월 28일
0
post-custom-banner

💡 진행 중인 Practice

  • Twitter 클론 코딩(Node.js)

🔎 에러 발생 경로

MySQL 데이터베이스 연결 후 코드 실행(npm start) 시 Error 발생

/Users/jaehyeon/Desktop/Dwitter/server/node_modules/mysql2/lib/packets/packet.js:728
    const err = new Error(message);
                ^

Error: Access denied for user 'root'@'localhost' (using password: YES)
    at Packet.asError (/Users/jaehyeon/Desktop/Dwitter/server/node_modules/mysql2/lib/packets/packet.js:728:17)
    at ClientHandshake.execute (/Users/jaehyeon/Desktop/Dwitter/server/node_modules/mysql2/lib/commands/command.js:29:26)
    at PoolConnection.handlePacket (/Users/jaehyeon/Desktop/Dwitter/server/node_modules/mysql2/lib/connection.js:456:32)
    at PacketParser.onPacket (/Users/jaehyeon/Desktop/Dwitter/server/node_modules/mysql2/lib/connection.js:85:12)
    at PacketParser.executeStart (/Users/jaehyeon/Desktop/Dwitter/server/node_modules/mysql2/lib/packet_parser.js:75:16)
    at Socket.<anonymous> (/Users/jaehyeon/Desktop/Dwitter/server/node_modules/mysql2/lib/connection.js:92:25)
    at Socket.emit (node:events:390:28)
    at Socket.emit (node:domain:475:12)
    at addChunk (node:internal/streams/readable:315:12)
    at readableAddChunk (node:internal/streams/readable:289:9) {
  code: 'ER_ACCESS_DENIED_ERROR',
  errno: 1045,
  sqlState: '28000',
  sqlMessage: "Access denied for user 'root'@'localhost' (using password: YES)",
  sql: undefined
}

🔐 해결 과정

👉 에러 코드를 통해 root아이디로의 mysql 접근이 거부되었다는 것을 확인

👉 구글링 및 에러 코드를 통해 비밀번호가 맞지 않아 발생되는 에러라는 것을 확인


👉 일단코드 상에서 잘못된 것은 없는지 host, user, database, password 확인해보자...

📌 db/database.js

import mysql from 'mysql2';
import { config } from '../config.js';

// mysql 접속
const pool = mysql.createPool({
    host: config.db.host,
    user: config.db.user,
    database: config.db.database,
    password: config.db.passowrd,
});

// 비동기 사용, promise 반환
export const db = pool.promise();

📌 config.js

import dotenv from 'dotenv';
dotenv.config();

function required(key, defaultValue = undefined) {
    const value = process.env[key] || defaultValue;
    // null, undefined 일 때 true

    if (value == null) {
        throw new Error(`Key ${key} is undefined`);
    }
    return value;
}

export const config = {
    jwt: {
        secretKey: required('JWT_SECRET'),
        expiresInSec: parseInt(required('JWT_EXPIRES_SEC', 86400)),
    },
    bcrypt: {
        saltRounds: parseInt(required('BCRYPT_SALT_ROUNDS', 12)),
    },
    host: {
        port: parseInt(required('HOST_PORT', 8080)),
    },
    db: {
        host: required('DB_HOST'),
        port: required('DB_PORT'),
        user: required('DB_USER'),
        database: required('DB_DATABASE'),
        passowrd: required('DB_PASSWORD'),
    }
}

📌 .env

JWT_SECRET=F2dN7x8HVzBWaQuEEDnhsvHXRWqAR63z
JWT_EXPIRES_SEC=86400
BCRYPT_SALT_ROUNDS=12
DB_HOST=localhost
DB_USER=root
DB_DATABASE=dwitter
DB_PASSWORD=woGUS4996!#
DB_PORT=3306

코드 상에서는 문제가 없다

👉 해당 아이디/비밀번호로 mysql 로그인이 되는지 확인해보자

정상적으로 로그인이 된다.

😅 왜 때문에 발생하는 문제인지......;

👉 코드를 지지고 볶고 구글링도 계속해보다가 console.log를 통해 직접 데이터를 찍어보기로 했다

😧 분명 .env 에서 mysql 비밀번호를 woGUS4996!#으로 설정을 했는데 왜 '#' 이 없지?

👉 database.js에서 .env 환경변수에서 읽지 않고 직접 코드 상에 비밀번호를 입력해봤다.

import mysql from 'mysql2';
import { config } from '../config.js';

// mysql 접속
const pool = mysql.createPool({
    host: config.db.host,
    user: config.db.user,
    database: config.db.database,
    password: 'woGUS4996!#',
});

// 비동기 사용, promise 반환
export const db = pool.promise();

😅 정상적으로 접속이 이루어진다;


🤔 이후 여러 경로로 환경변수를 바꿔보며 '#' 특수기호를 읽어보려 했지만 .env 환경변수를 통해 값을 읽어오면 값이 읽히지 않았다.

구글링을 통해 환경변수와 특수기호, # 관련된 것들을 찾아봤지만 나와 같은 이슈를 겪은 글은 발견하지 못했다.

이전에 윈도우에서 해당 비밀번호를 사용 했을 때 관련된 오류가 발생하지 않았기에 맥북에서 내가 설정을 건드렸거나 혹은 다른 이유가 있을 것이라 예상한다...

일단은 MySQL 비밀번호에서 # 기호는 쓰지 않는걸로....😿

post-custom-banner

0개의 댓글