1. UserStorage.js에 있던 사용자 id, pw, name 정보를 파일로 따로 만들기

 -src 폴더 안에 DB용 폴더 생성(src > databases > user.json)

 -user.json파일에 is, pw, name을 담고 있던 사용자 객체를 json 형식으로 복사(각 변수의 이름을 문자열로 처리해주기)

  // user.json

        {                
            "id": ["사용자1", "사용자2", "사용자3"],
            "pw": ["1234", "3456", "5678"],
            "name": ["이름1", "이름2", "이름3"]
        }

 

 

2. UserStorage.js 폴더에 있던 사용자 객체는 지우고 대신, 데이터 파일에 접근할 수 있도록 file system 불러오기

// UserStorage.js

const fs = require("fs")

 

 

3. UserStorage.js 폴더에 있던 #users객체를 지웠으므로 로그인을 위한 메서드였던 static getUserInfo()에 있던 users도 fs에서 불러오도록 변경

 -id와 id, pw, name이 저장된 파일을 불러온 뒤 비교하는 이후의 과정은 파일을 불러오는 fs.readFile이 성공했을 때 실행(.then)

 -그 외 에러가 나면 예외 처리(.catch)

// UserStorage.js (버전 1)

static getUserInfo(id) {
  return fs.readFile("./src/databases/users.json")
    .then((data) => {
      const users = JSON.parse(data); // json형태릐 데이터를 읽는 함수
      const idx = users.is.indexOf(id);
      const usersKeys = Object.keys(users);
      const userInfo = usersKeys.reduce((newUser, info) => {
        newUser[info] = users[info][idx];
        return newUser;
      }, {});
      return userInfo;
    })
    
    .catch(console.error);
}
// UserStorage.js (버전 2)(깔끔하게 함수로 정리한 버전)

static getUserInfo(id) {
  return fs.readFile("./src/databases/users.json")
    .then((data) => {
      return this.#getUserInfo(data, id);
    })
    
    .catch(console.error);
}

static #getUserInfo(data, id) { // 파일 불러오기 성공 시 수행되는 동작을 깔끔하게 함수로 묶어 빼주기
  const users = JSON.parse(data);
  const idx = users.is.indexOf(id);
  const usersKeys = Object.keys(users);
  const userInfo = usersKeys.reduce((newUser, info) => {
    newUser[info] = users[info][idx];
    return newUser;
  }, {});
  return userInfo;
}

 

 

4. User.js 파일에서 login()함수를 UserStorage함수가 바뀐 것에 따라 바꿔주기

// User.js

"use strict";

class User{
  // constructor 생략
  
  async login() {
    const client = this.body
    
    // UserStorage에서 getUserInfo를 실행할 때, json파일을 불러올 때 시간이 걸림
    // javascript는 비동기 처리를 하므로 json파일을 다 불러올 때까지 기다리지 않고 이 id, pw 비교 작업을 수행
    // 그에 따라 아직 불러오지 못한 json파일과 비교하며 undefined가 됨
    // 이를 방지하기 위해 await를 써서 UserStorage.getUserInfo가 다 시행될 때까지 기다리는 명령을 부여
    // 이때, await는 async 함수에서만 사용이 가능하므로 login() 함수를 async login()으로 변경
    const {id, pw} = await UserStorage.getUserInfo(client.id);
      if (id) {
        if (id === client.id && pw === client.pw) {
          return {success: true};
        }
        return {success: false, msg: "비밀번호가 틀렸습니다."};
      }
      return {success: false, msg: "존재하지 않는 아이디입니다."};
    }
  
  // register() 생략
}

module.exports = User;

 -await를 사용하지 않고 console.log(fs)를 통해 promise로 설정된 fs를 출력하면 promise: {<pending>}이 출력

  ※ "promise: {}": 데이터를 전부 읽어오지 못했다는 의미

 -또한, User.js파일에서 UserStorage.getUserInfo(client.id)를 console.log로 출력하면 아직 json파일을 불러오지 못해 id가 정의되지 않음

  →undefined가 뜸

 

 

5. controller인 home.ctrl.js파일에서도 login 메서드를 실행할 때 login 메서드가 User.js 파일 내에서 다 실행될 때까지 기다리도록 await 적용

// home.ctrl.js

const process = {
  login: async (req, res) => {
    const user = new User(req.body);
    const response = await user.login();
    return res.json(response);
  },
  
  //register 생략
};

 

+ Recent posts