통합구현 #11 - exam_back

김형우·2022년 3월 17일
0

mongoose + vue.js

목록 보기
12/15

0. 백엔드 프로젝트 만들기

CMD> express -e exam_back

CMD> cd exam_back

CMD> npm install

CMD> npm i --save mongoose
CMD> npm i --save mongoose-sequence
CMD> npm i --save jsonwebtoken

CMD> nodemon --inspect ./bin/www


1. app.js

// npm i mongoose --save
var mongoose = require('mongoose');
mongoose.connect('mongodb://id201:pw201@1.234.5.158:37017/db201');
var db = mongoose.connection;
db.once('open', function() {
	console.log('mongodb 연결됨');
});

// 라우터 연결
var memberRouter = require('./routes/member');
app.use('/member', memberRouter);

2. /models/member.js

  • entity = Schema
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var memberSchema = new Schema({
    _id         : {type : String, default : ''},
    password    : {type : String, default : ''},
    name        : {type : String, default : ''},
    email       : {type : String, default : ''},
    age         : {type : Number, default : 0},
    regdate     : {type : Date, default : Date.now}
});

module.exports = mongoose.model('member_exam', memberSchema);

3. /token/auth.js

const jwt = require('jsonwebtoken');

const self = module.exports = {
    securityKEY : 'aro9515',
    options : {
        algorithm : 'HS256',
        expiresIn : '30m',
        issuer    : 'ds',
    },

    checkToken : async(req,res,next) => {
        try {
            const token = req.headers.token;

            if (token === null) {
                return res.send({status:0, result:'토큰없음'});
            }
            
            const sessionData = jwt.verify(token, self.securityKEY);
            
            if (typeof sessionData.USERID === 'undefined') {
                return res.send({status:0,result:'토큰복원실패'})
            }
            if (typeof sessionData.USERNAME === 'undefined') {
                return res.send({status:0,result:'토큰복원실패'})
            }
            
            req.body.USERID = sessionData.USERID;
            req.body.USERNAME = sessionData.USERNAME;

            next();
        } catch (e) {
            console.error(e);
            if(e.message === 'invalid signature') {
                return res.send({status:-1,result:'토큰인증실패'})
            }
            if(e.message === 'jwp expired') {
                return res.send({status:-1,result:'토큰시간만료'})
            }
            if(e.message === 'invalid token') {
                return res.send({status:-1,result:'유효하지않은토큰'})
            }
            return res.send({status:-1,result:'유효하지않은토큰'})
        }
    }
}

4. /routes/member.js

  • Controller
var express = require('express');
var router = express.Router();

// hash 모듈
const crypto = require('crypto');

// Schema
var Member = require('../models/member');

// 토큰 사용
var jwt = require('jsonwebtoken');
var auth = require('../token/auth');

// 회원가입 POST => 127.0.0.1:3000/member/join
// 로그인   POST => 127.0.0.1:3000/member/login
// 한명조회 GET  => 127.0.0.1:3000/member/selectone
// 정보수정 PUT  => 127.0.0.1:3000/member/update
// 회원탈퇴 DELETE => 127.0.0.1:3000/member/delete
/////////////////////////////////////////////////////

// 회원가입 POST => 127.0.0.1:3000/member/join
// body : {"id":"aa", "pw":"aa", "name":"aa", "email":"a@a.com","age":36}
router.post('/join', async function(req, res, next) {
    try {
        const hashPw = crypto.createHmac('sha256', req.body.id,).update(req.body.pw).digest('hex');
        
        var member = new Member();
        member._id = req.body.id;
        member.password = hashPw;
        member.name = req.body.name;        
        member.email = req.body.email;        
        member.age = Number(req.body.age);

        const result = await member.save();
        // console.log('/join/result ===> ',result);
        if (result._id === req.body.id) {
            return res.send({status:200});
        }
        return res.send({status:0});
    } catch (e) {
        console.error(e);
        return res.send({status:-1});
    }
});

// 로그인   POST => 127.0.0.1:3000/member/login
// body : {"id":"aa", "pw":"aa"}
router.post('/login', async function(req, res, next) {
    try {
        const hashPw = crypto.createHmac('sha256', req.body.id).update(req.body.pw).digest('hex');
        
        const result = await Member.findOne({$and : [{_id : req.body.id, password : hashPw}]});

        // const query = {$and : [{_id : req.body.id, password : hashPw}]};
        // const result = await Member.findOne(query);

        // console.log('/login/result ===> ',result);
        if (result !== null) {
            // 로그인 성공시점 => 토큰 발행
            const sessionData = {
                USERID : result._id, 
                USERNAME : result.name
            };
            const token = jwt.sign(sessionData,auth.securityKEY, auth.options);

            return res.send({status:200, token:token});            
        }
        return res.send({status:0});
    } catch (e) {
        console.error(e);
        return res.send({status:-1});
    }
});

// 한명조회 GET  => 127.0.0.1:3000/member/selectone
router.get('/selectone', auth.checkToken, async function(req, res, next) {
    try {
        const tokenID = req.body.USERID;
        // console.log('/selectone/tokenID ===> ', tokenID);
        const result = await Member.findOne({_id : tokenID}).select({_id : 1, name : 1, age : 1});
        // console.log('/selectone/result ===> ',result);
        if (result !== null) {
            return res.send({status:200, result:result});            
        }        
        return res.send({status:0});
    } catch (e) {
        console.error(e);
        return res.send({status:-1});
    }
});

// 정보수정 PUT  => 127.0.0.1:3000/member/update
// body : { "name":"update", "age":1234 }
router.put('/update', auth.checkToken, async function(req, res, next) {
    try {
        const tokenID = req.body.USERID;
        const member = await Member.findOne({_id : tokenID}).select({password:0});
        // console.log('/update/member ===> ',member);
        
        member.name = req.body.name;
        member.age = req.body.age;

        const result = await member.save();
        // console.log('/update/result ===> ',result);
        if (result.name === req.body.name && result.age === req.body.age) {
            return res.send({status:200});            
        }        
        return res.send({status:0});
    } catch (e) {
        console.error(e);
        return res.send({status:-1});
    }
});

// 회원탈퇴 DELETE => 127.0.0.1:3000/member/delete
// body : { "pw":"aa" }
router.delete('/delete', auth.checkToken, async function(req, res, next) {
    try {
        const tokenID = req.body.USERID;
        const hashPw = crypto.createHmac('sha256', tokenID).update(req.body.pw).digest('hex');
        // console.log('/delete/tokenID ===> ', tokenID);
        // console.log('/delete/hashPw ===> ',hashPw);
        const result = await Member.deleteOne({_id:tokenID, password:hashPw});
        // console.log('/delete/result ===> ',result);
        if (result.deletedCount === 1) {
            return res.send({status:200});            
        }
        return res.send({status:0});
    } catch (e) {
        console.error(e);
        return res.send({status:-1});
    }
});

router.get('/', async function(req, res, next) {
    try {
        
        return res.send({status:200});
    } catch (e) {
        console.error(e);
        return res.send({status:-1});
    }
});

module.exports = router;
profile
The best

0개의 댓글