본문 바로가기
Team Project/노테(Note)

20200210 nodejs - express에서 mongodb 사용하기

by somsomdah 2020. 2. 10.

로그인, 회원가입 화면 만들기

 

1. 회원가입

1.1 처음 로그인 화면 (/public/login.html)

 

1.2. '회원가입'을 누르면 사용자 추가 화면(/public/addUser.html)으로 이동

 

1.3. '전송'을 누르면 사용자 데이터베이스에 사용자 등록됨

(/process/adduser)

 

1.4. 사용자 등록 전, 등록 후 데이터베이스 확인하기

사용자 등록 전
사용자 등록 후

 

 

 

 

 

2. 로그인

 

2.1. 로그인하기

 

 

2.2 데이터베이스에 사용자 정보가 등록되어있다면 로그인 성공

(/process/login)

 

 

2.3. 데이터베이스에 입력한 정보가 없다면 로그인 실패

 

 

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>로그인 테스트</title>
	</head>
<body>
	<h1>로그인</h1>
	<br>
	<form method="post" action="/process/login">
		<table>
			<tr>
				<td><label>아이디</label></td>
				<td><input type="text" name="id" /></td>
			</tr>
			<tr>
				<td><label>비밀번호</label></td>
				<td><input type="password" name="password" /></td>
			</tr>
		</table>
		<input type="submit" value="전송" name="" />
		<br><br><a href='/public/addUser.html'>회원가입</a>
	</form>
</body>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>사용자추가 테스트</title>
	</head>
<body>
	<h1>사용자추가</h1>
	<br>
	<form method="post" action="/process/adduser">
		<table>
			<tr>
				<td><label>아이디</label></td>
				<td><input type="text" name="id" /></td>
			</tr>
			<tr>
				<td><label>비밀번호</label></td>
				<td><input type="password" name="password" /></td>
			</tr>
			<tr>
				<td><label>사용자명</label></td>
				<td><input type="text" name="name" /></td>
			</tr>
		</table>
		<input type="submit" value="전송" name="" />
	</form>
</body>
</html>
var express=require('express'),http=require('http'),path=require('path');
var bodyParser=require('body-parser'),cookieparser=require('cookie-parser'),static=require('serve-static')
var expressSession=require('express-session'),expressErrorHandler=require('express-error-handler')
var MongoClient=require('mongodb').MongoClient;


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 database;

// 데이터베이스 연결 함수
function connectDB(){
    console.log('connectDB 호출됨')
    var databaseUrl='mongodb://localhost:27017/local'
    MongoClient.connect(databaseUrl,function(err,db){ //데이터베이스가 정상적으로 연결되면 db객체에 전달됨
        if(err) throw err;
        console.log('데이터베이스에 연결되었습니다')
        //database=db; //mongodb 3.0 이상이서 작동하지 않음
        database = db.db('local');
    })
}

// 사용자 인증 함수
var authUser=function(database,id,password,callback){
    console.log('authUser 호출됨');

    //users collection 참조
    var users = database.collection('users');
    
    // 사용자 찾기 - 조회결과는 toArray를 통해 배열로 전배열로 바꿔줌
    users.find({"id":id,"password":password}).toArray(function(err,docs){ //콜백 함수에는 toArray의 문서 객체 docs 전달됨

        console.log('users.find().toArray() 호출됨')
        if(err){callback(err,null); return;}

        if(docs.length>0){ // 사용자 데이터 조회
            console.log('아이디 [%s], 비밀번호 [%s]가 일치하는 사용자 찾음',id,password);
            callback(null,docs);

        }else{ // 사용자 데이터 없음
            console.log('일치하는 사용자 찾지 못함');
            callback(null,null);
        }
    })
}

var addUser=function(database,id,password,name,callback){
    console.log('addUser 호출됨 : '+id+','+password+','+name);

    //users collection 참조
    var users = database.collection('users');

    // 데이터 추가
    users.insertMany([{"id":id,"password":password,"name":name}],function(err,result){

        //오류가 발생했을 때 콜백함수를 호출하면서 오류 객체 전달
        if(err){ 
            callback(err,null);
            return;
        }

        // 오류가 아닌 경우 콜백 함수를 호출하면서 결과 객체 전달
        else if(result.insertedCount>0){ //추가된 레코드의 갯수 확인
            console.log("사용자 레코드 추가됨 : "+result.insertedCount);
        } else {
            console.log("추가된 레코드 없음");
        } callback(null,result);
    })
}


router=express.Router()

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

    var paramId=req.param('id')
    var paramPassword=req.param('password');
    
    // 데이터베이스여 연결됨
    if(database){

        authUser(database,paramId,paramPassword,function(err,docs){
            console.log("authUser callback 호출됨") // 콜백함수는 기존 함수의 내용이 전부 실행된 다음에 실행됨
            if(err) {throw err;}
            if(docs){
                console.dir(docs);
                var username=docs[0].name;
                res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
				res.write('<h1>로그인 성공</h1>');
				res.write('<div><p>사용자 아이디 : ' + paramId + '</p></div>');
				res.write('<div><p>사용자 이름 : ' + username + '</p></div>');
				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 {  // 데이터베이스 객체가 초기화되지 않은 경우 실패 응답 전송
		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.param('id')
    var paramPassword=req.param('password');
    var paramName=req.param('name');

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

    if(database){
        addUser(database,paramId,paramPassword,paramName,function(err,result){
            if(err) throw err;

            if (result && (result.insertedCount>0) ){
                console.dir(result);
                res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
                res.write('<h2>사용자 추가 성공</h2>');
                res.write("<br><br><a href='/public/login.html'>로그인하기</a>");
				res.end();
            }
            else{
                res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
				res.write('<h2>사용자 추가 실패</h2>');
				res.end();
            }
        })
    }

    else {  // 데이터베이스 객체가 초기화되지 않은 경우 실패 응답 전송
		res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
		res.write('<h2>데이터베이스 연결 실패</h2>');
		res.write('<div><p>데이터베이스에 연결하지 못했습니다.</p></div>');
		res.end();
	}
})

app.use('/',router)

app.use(expressErrorHandler(404));
app.use(expressErrorHandler({static:{'404':'./public/404.html'}}))

http.createServer(app).listen(app.get('port'),function(){
    console.log('서버가 시작되었습니다.')
    connectDB();
})

'Team Project > 노테(Note)' 카테고리의 다른 글

200512 NOTE 회의록  (0) 2020.05.13
200302 회의록  (0) 2020.03.02
200113 회의록 (피그마 프로토타입 제작)  (0) 2020.01.13
191202 회의록  (0) 2019.12.02
191125 프로젝트 기획  (0) 2019.11.25

댓글