본문 바로가기
IT

Day8

by 깻잎쌈 2020. 2. 1.
반응형

MySQL 연결해서 

사용자 등록 , 로그인

// MySQL 연결 설정
var pool = mysql.createPool({
    connectionLimit :10,
    host:'localhost',
    user:'root',
    password: 'my password',
    database:'my db name',
    debug:false
});

var express = require('express'),
    http = require('http'),
    path = require('path');

var bodyParser = require('body-parser'),
    static = require('serve-static'),
    expressErrorHandler = require('express-error-handler'),
    cookieParser = require('cookie-parser'),
    expressSession = require('express-session');


var mysql = require('mysql');

// MySQL 연결 설정
var pool = mysql.createPool({
    connectionLimit :10,
    host:'localhost',
    user:'root',
    password: 'my password',
    database:'my db name',
    debug:false
});


var app = express();

app.set('port', process.env.port || 3000);

app.use(bodyParser.urlencoded({
    extended: false
}));
app.use(bodyParser.json());
app.use('/public', static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(expressSession({
    secret: 'my key',
    resave: true,
    saveUninitialized: true
}));


// 사용자 인증
var authUser = function ( id, password, callback) {
    console.log('authUser 함수 호출됨');
    
    // 커넥션 풀에서 연결 객체를 가져옴
    pool.getConnection(function(err, conn){
        if(err){
            if(conn){
                conn.release();
            }
            
            callback(err, null);
            return;
        }
        
        console.log('database 연결 스레드 id : '+ conn.threadId);
        
        var columns =['id', 'name','age'];
        var tablename = 'users';
        
        //sql 실행 
        var exec = conn.query("select ?? from ?? where id = ? and password = ?",
                             [columns, tablename, id, password], function(err, rows){
            
            conn.release();
            console.log('실행대상 SQL : '+ exec.sql);
            
            if(rows.length>0){
                console.log('ID: %s, PASSWORD : %s 일치하는 ㅅ 찾음 ', id, password);
                callback(null,rows);
            }else{
                console.log('일치하는 ㅅ 못 찾음 ');
                callback(null, null);
            }
        });
    })   

}

// 사용자 추가
var addUser = function (id, name, age, password, callback) {
    console.log('adduser 호출됨 ' + id);
    
    //커넥션 풀에서 연결 객체를 가져옴
    pool.getConnection(function(err, conn){
        if(err){
            console.error(err.stack);
            if(conn){
                conn.release();
            }
            
            callback(err,null);
            return;
        }
        
        console.log('db 연결 스레드 ID : '+ conn.threadId);
        
        //data를 객체로 만들기
        var data = {id:id, name:name, age:age, password:password};
        
        //SQL문을 실행
        var exec = conn.query('insert into users set ?', data, function(err, result){
            conn.release();//★
            console.log('실행대상 sql : '+ exec.sql);
            
            if(err){
                console.log('SQL 실행 시 오류 발생');
                console.log(err);
                
                callback(err,null);
                return;
            }
            
            callback(null,result);
        });
    })

}

var router = express.Router();

router.route('/process/login').post(function (req, res) {
    console.log('/process/login 호출됨 ');

    var paramId = req.body.id || req.query.id;
    var paramPassword = req.body.password || req.query.password;
    
    if(pool){
        authUser(paramId, paramPassword, function(err, rows){
            if(err){
                console.log('사용자 인증 중 오류 발생 : '+ err.stack);
                
                res.writeHead('200', {
                    'Content-Type': 'text/html;charset=utf8'
                });
                res.write('<h1> 로그인 중 오류 발생 </h1>');
                res.write('<p>' + err.stack + '</p>');
                res.end();
                
                return;
            }
            
            if(rows){
                console.log(rows);
                
                var username = rows[0].name;
                
                res.writeHead('200', {
                    'Content-Type': 'text/html;charset=utf8'
                });
                res.write('<h1> 로그인 성공 </h1>');
                res.write("<br><br><a href = '/public/login.html'> 다시 로그인 </a>")
                res.end();
                
            }else{
                res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
				res.write('<h1>로그인  실패</h1>');
				res.write('<div><p>아이디와 패스워드를 다시 확인하십시오.</p></div>');
				res.write("<br><br><a href='/public/login.html'>다시 로그인하기</a>");
				res.end();
            }
        
        });
    }else{
        console.log('db 연결 실패');
        res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
		res.write('<h2>데이터베이스 연결 실패</h2>');
		res.write('<div><p>데이터베이스에 연결하지 못했습니다.</p></div>');
		res.end();
      
    }

});

//사용자 추가 라우팅 함수 
router.route('/process/adduser').post(function (req, res) {
    console.log('/process/adduser 호출됨');

    var paramId = req.body.id || req.query.id;
    var paramPassword = req.body.password || req.query.password;
    var paramName = req.body.name || req.query.name;
    var paramAge = req.body.age || req.query.age;

    console.log('요청 파라미터 : ' + paramId + ', ' + paramPassword + ', ' + paramName+','+paramAge);

    //pool 객체가 초기화된 경우
    if(pool){
        addUser(paramId,paramName,paramAge,paramPassword, function(err,result){
            if(err){
                console.log('사용자 추가 중 에러발생'+ err.stack);
                res.writeHead('200', {'Content-Type': 'text/html;charset=utf8'});
                res.write('<h1> 사용자 추가중 에러발생 </h1>');
                res.write('<p>' + err.stack + '</p>');
                res.end();
                
                return;
            }
            
            //결과 있으면 
            if(result){
                console.log(result); // 추가된 사용자 보여주고
                console.log('inserted '+ result.affectedRows + +' rows')
                
                var insertId = result.insertId;
                console.log('추가한 레코드의 아이디 : '+ insertId);
                res.writeHead('200', {'Content-Type': 'text/html;charset=utf8'});
                res.write('<h1> 사용자 추가 성공 </h1>');
                res.end();
            }else{
                res.writeHead('200', {'Content-Type': 'text/html;charset=utf8'});
                res.write('<h1> 사용자 추가 실패 </h1>');
                res.end();
            }
        });
        //db 연결 실패 
    }else{
         res.writeHead('200', {'Content-Type': 'text/html;charset=utf8'});
         res.write('<h1> db연결 실패 </h1>');
         res.end();
    }

});

app.use('/', router);

var errorHandler = expressErrorHandler({
    static: {
        '404': './public/404.html'
    }
});

app.use(expressErrorHandler.httpError(404));
app.use(errorHandler);


app.listen(app.get('port'), function () {
    console.log('Server Started ' + app.get('port'));

});
반응형

'IT' 카테고리의 다른 글

Day10  (2) 2020.02.04
Day 9  (0) 2020.02.02
Day7 -1  (0) 2020.01.31
Day7  (0) 2020.01.31
Day6  (0) 2020.01.29

댓글