1. UserStorage.js에 있던 사용자 id, pw, name 정보를 파일로 따로 만들기
-src 폴더 안에 DB용 폴더 생성(src > databases > user.json)
-user.json파일에 is, pw, name을 담고 있던 사용자 객체를 json 형식으로 복사(각 변수의 이름을 문자열로 처리해주기)
// user.json
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 생략
};
'back-end > Javascript' 카테고리의 다른 글
[Node.js] curl 명령어와 API테스트 도구(POSTMAN) (1) | 2022.12.23 |
---|---|
[Node.js] 파일DB로 회원가입 구현 (0) | 2022.12.12 |
[Node.js] 회원가입 페이지 요청 구현 (0) | 2022.12.06 |
[Node.js] 로그인 모델 구현 (0) | 2022.12.01 |
[Node.js] 서버에서 받은 데이터에 따라 프런트 동작 처리하기 (0) | 2022.11.30 |