[ sequelize | express | TIL ] express와 sequelize로 회원가입과 로그인 구현

Haksoo JI·2023년 1월 19일
0

[ TIL ]

목록 보기
21/30

express와 sequelize로 회원가입과 로그인 구현

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/storestore의 회원가입이다.

  • 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일 경우에는 로그인 실패를 알리는 메시지를 응답하도록 코드를 작성해보았다.
profile
아직 씨앗입니다. 무슨 나무가 될까요?

0개의 댓글