본문 바로가기
IT/web

Node.js] MySQL 연결, 사용자 추가, 로그인

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

커넥션 풀 설정 

var mysql = require('mysql');

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

커넥션 풀을 연결 개수를 제한하기 때문에 (connectionLimit)

사용 후에 반드시 풀에 다시 넣어줘야 한다.

conn.release()

pool.getConnection(function(err, conn){
        if(err){
            console.error(err.stack);
            if(conn){
                conn.release();
            }
            
            callback(err,null);
            return;
        }
           ...

 

Create a MySQL Database Middleware with Node.js and Async/Await

Write a robust MySQL database middleware for your next Node.js project that automatically handles connection drops and SQL query queues.

medium.com

 

 

MySQL 연동 | PoiemaWeb

Node.js(express)와 MySQL 연동

poiemaweb.com

 

mysqljs/mysql

A pure node.js JavaScript Client implementing the MySQL protocol. - mysqljs/mysql

github.com


쿼리문 입력

var data = {id:id, name:name, age:age, password:password};
var exec = conn.query('insert into users set ?', data, function(err, result){
 
		...

var columns =['id', 'name','age'];
var tablename = 'users';
        
var exec = conn.query("select ?? from ?? where id = ? and password = ?",
                             [columns, tablename, id, password], function(err, rows){
         ...

?와 ??는 쓰이는 게 다르다

' ' 있고 없고 

 

mysqljs/mysql

A pure node.js JavaScript Client implementing the MySQL protocol. - mysqljs/mysql

github.com

 

 


사용자 추가

// 사용자 추가
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);
        });
    })

}

라우팅 함수 

더보기
//사용자 추가 라우팅 함수 
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();
    }

});

로그인 / 사용자 인증 

// 사용자 인증
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);
            }
        });
    })   

}

라우팅 함수

더보기
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();
      
    }

});
반응형

댓글