[node.js] readFile과 readFileSync

Park·2023년 7월 2일
0

1. 발생 문제점

  • mysql db의 엔드포인트, 비밀번호 등 개인정보를 담은 텍스트 파일을 읽은 후 => 추출한 db정보를 가지고 mysql 연결시도 했더니, dbInfo에 아무런 정보도 없어서 에러가 생겼다.
const mysql   = require("mysql");
const fs = require('fs');

// db정보
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;

참고자료

  1. Difference between readFile() and readFileSync() : https://stackoverflow.com/questions/17604866/difference-between-readfile-and-readfilesync
profile
안녕하세요!

0개의 댓글