cookie, session, jwt 토큰을 활용한 로그인 유지 기능이 아니라 단순히 sequelize를 통해 데이터베이스를 조회해서 회원가입과 로그인을 가능하게 해주는 기능이다.
쿠키와 세션, 토큰을 활용한 로그인 유지기능도 추후 구현 예정이다.
프로젝트 내에서 회원가입과 로그인을 하는 사용자의 타입이 고객(user)과 사장(store) 두 가지가 있도록 설계했다. 코드도 이에 따라서 두 종류이다.
const express = require('express');
const router = express.Router();
const { User, Store } = require('../models');
router.post('/signup/user', async (req, res, next) => {
const { userNickname, inputPassword, userEmail, userPhone } = req.body;
try {
const user = await User.create({
nickname: userNickname,
password: inputPassword,
email: userEmail,
phone: userPhone,
});
res.status(201).json({ msg: '손님으로 가입성공!' });
} catch (err) {
console.error(err);
next(err);
}
});
router.post('/signup/store', async (req, res, next) => {
const { storeName, inputPassword, storeEmail, storePhone, storeAddress } =
req.body;
try {
const store = await Store.create({
store_name: storeName,
password: inputPassword,
email: storeEmail,
phone: storePhone,
location: storeAddress,
});
res.status(201).json({ msg: '사장님으로 가입성공!' });
} catch (err) {
console.error(err);
next(err);
}
});
module.exports = router;
라우팅 경로가 /signup/user
인 것이 user
의 회원가입이고, signup/store
가 store
의 회원가입이다.
sequelize
문법 중에 create
을 사용해서 req.body
로 받아온 데이터들을 DB에 insert
하도록 만들었다.
const express = require('express');
const router = express.Router();
const { User, Store } = require('../models');
const { Op } = require('sequelize');
router.get('/login', (req, res, next) => {
res.render('login', { title: '로그인' });
});
router.post('/login/user', async (req, res, next) => {
const { nickname, password } = req.body;
console.log(`@@@@@@@ nickname: ${nickname}, password: ${password}`);
try {
const userId = await User.findOne({
where: { [Op.and]: [{ nickname }, { password }] },
});
if (userId === null) {
return res.json({ msg: 'fail' });
}
return res.json({ msg: 'success' });
} catch (err) {
console.error(err);
next(err);
}
});
router.post('/login/store', async (req, res, next) => {
const { store_name, password } = req.body;
console.log(`@@@@@@@ store_name: ${store_name}, password: ${password}`);
try {
const storeId = await Store.findOne({
where: { [Op.and]: [{ store_name }, { password }] },
});
if (storeId === null) {
return res.json({ msg: 'fail' });
}
return res.json({ msg: 'success' });
} catch (err) {
console.error(err);
next(err);
}
});
module.exports = router;
validation
을 위해서 findOne
으로 데이터를 조회하는 메서드의 반환값을 변수에 할당하게 했다. 만약 조회된 것이 없으면 이 변수에는 null
값이 할당된다.null
일 경우에는 로그인 실패를 알리는 메시지를 응답하도록 코드를 작성해보았다.