1. 발생 문제점
- mysql db의 엔드포인트, 비밀번호 등 개인정보를 담은 텍스트 파일을 읽은 후 => 추출한 db정보를 가지고 mysql 연결시도 했더니,
dbInfo
에 아무런 정보도 없어서 에러가 생겼다.
const mysql = require("mysql");
const fs = require('fs');
const dbInfo = {};
fs.readFile('conf/db_info.txt', 'utf8', (err, data) => {
if (err) {
console.error(err);
return;
}
const lines = data.split('\n');
lines.forEach((line) => {
const parts = line.trim().split('=');
if (parts.length === 2) {
const key = parts[0].trim();
const value = parts[1].trim();
if (key == "port") {
dbInfo[key] = Number(value);
}
else {
dbInfo[key] = value;
}
}
});
console.log(dbInfo);
});
const db = mysql.createConnection({
host: dbInfo["host"],
user: dbInfo["user"],
password: dbInfo["password"],
database: dbInfo["database"],
port: dbInfo["port"],
});
db.connect();
2. 원인 파악
fs
모듈의 readFile
은 비동기적으로 처리하기 때문에, 파일 시스템에서 파일을 읽어올 동안, MySQL에 connection을 시도하기 때문이다.
- 당연히
dbInfo
에는 아무 정보가 없기 때문에, 에러가 생긴 것
3. 해결
fs
모듈의 readFileSync
을 통해 동기적으로 파일 입출력을 하면 된다.
- javascript의 콜백, 비동기 개념을 깊게 공부 필요성 느낌
const mysql = require("mysql");
const fs = require('fs');
// 파일 동기적으로 읽기
const data = fs.readFileSync('conf/db_info.txt', 'utf8');
// 줄 단위로 분할
const lines = data.split('\n');
// 각 줄에서 정보 추출
const dbInfo = {};
lines.forEach((line) => {
const parts = line.trim().split('=');
if (parts.length === 2) {
const key = parts[0].trim();
const value = parts[1].trim();
if (key === "port") {
dbInfo[key] = Number(value);
} else {
dbInfo[key] = value;
}
}
});
// MySQL 연결
const db = mysql.createConnection({
host: dbInfo["host"], // 호스트
user: dbInfo["user"], // 데이터베이스 계정
password: dbInfo["password"], // 데이터베이스 비밀번호
database: dbInfo["database"], // 사용할 데이터베이스
port: dbInfo["port"],
});
// 연결 시도
db.connect((err) => {
if (err) {
console.error('MySQL 연결 오류:', err);
return;
}
console.log('MySQL에 연결되었습니다.');
});
module.exports = db;
참고자료
- Difference between readFile() and readFileSync() : https://stackoverflow.com/questions/17604866/difference-between-readfile-and-readfilesync