Programming/온라인 영어암기 단어장 개발

온라인 영어 암기 단어장 만들기(3) - 로그인, 회원가입 로직추가

juhpark 2024. 11. 22. 00:00

노드 서버에서 로그인과 회원가입을 처리하는 router를 만들었다. /login 경로에서 로그인과 회원가입을 동시에 처리할 수 있도록 구성하였다.

  • 로그인시
    • 기본적인 null 체크
    • mongoose에서 id와 password를 비교한 뒤 맞는 경우, 성공 메시지를 출력
  • 회원가입시
    • 기본적 null 체크
    • email 형식체크(emailCheck함수)
    •   mongoose에서 req.body 데이터를 적절한 구조로 만들어 저장

 

1. 라우터 소스

 데이터베이스의 모델은 자유롭게 스키마를 변경할 수 있도록 {strict:false} 옵션을 사용했고, 데이터베이스상에 users 객체가 있는 경우와 없는 경우 동시에 사용할 수 있도록 user_model 변수를 생성

const mongoose = require('mongoose');
const { Schema } = mongoose;  

const user_model = mongoose.models['user']||
                   mongoose.model('user', new Schema({_id:String, pw:String, 
                                                      email:String}, 
                                                     { strict: false }));

router.post('/login', async(req, res) => { 

    if(req.body.userid=='') res.json({isLogin: false, state: 'error', 
                                       message:'Username is null !'})
    if(req.body.password=='') res.json({isLogin: false, state: 'error', 
                                        message:'Password is null !'})
    
    if(req.body.type=='signin'){
        var result = await user_model.find({_id: req.body.userid, 
                                            pw: req.body.password})
        if(result.length==0){        
            res.json({isLogin: false, state: 'error', 
               message:'User does not exists or<Br> Password does not match !'})
        }else if(result.length==1){     
            req.session.username = req.body.userid;   
            res.json({isLogin:true, state:'success', message:''})
        } 
    }else if(req.body.type=='signup'){
        if(req.body.email=='') res.json({isLogin: false, state: 'error', 
                               message:'Email is null !'})
        if(req.body.password2=='') 
               res.json({isLogin: false, state: 'error', 
                        message:'Confirm Password is null !'})
        if(req.body.password!=req.body.password2) 
               res.json({isLogin: false, state: 'error', 
                        message:'Password is not match !'})
        if(emailCheck(req.body.email)==false) 
               res.json({isLogin: false, state: 'error', 
                        message:'Email is not valid !'})
        
        req.body['_id'] = req.body.userid
        req.body['pw'] = req.body.password
        delete req.body['userid']
        delete req.body['type']
        delete req.body['password2']
        delete req.body['password2']
        try{
            var result = await user_model.create(req.body)
            req.session.username = req.body.userid;
            res.json({isLogin: true, state: 'success', 
                      message:''})
        }catch(err){
            res.json({isLogin: false, state: 'error', 
                      message:err.message.split(":")[0]})
        } 
    }
});

 

2. 이메일 형식체크 함수

이메일 형식체크는 정규식을 사용하여 이메일의 형식을 체크하도록 하는 샘플을 참조하여 구현하였다.

function emailCheck(email_address){		
    email_regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i;
    if(!email_regex.test(email_address)){ 
        return false; 
    }else{
        return true;
    }
}