Nodejs 공부하기!

[Nodejs] mongoDB 연동해서 로그인 하기(1)

hyer!! 2020. 12. 8. 12:51
//사용자 로그인 하기

/*
npm install express --save
npm install http --save
npm install path --save
npm install body-parser --save
npm install cookie-parser --save
npm install serve-static --save
npm install errorhandler --save
npm install express-error-handler --save
npm install express-session --save
npm install mongodb --save
*/ 

//Express 기본 모듈 불러오기
var express = require('express')
    ,http = require('http')
    ,path = require('path');

//Express의 미들웨어 불러오기
var bodyParser = require('body-parser')
    , cookieParser = require('cookie-parser')
    , static = require('serve-static')
    , errirHandler = require('errorhandler');

//오류 핸들러 모듈 사용
var expressErrorHandler = require('express-error-handler');

//Session 미들웨어 불러오기
var expressSession = require('express-session');

//익스프레스 객체 생성
var app = express();

//서버에서 사용할 포트 정보를 설정함
app.set('port', process.env.PORT || 3000);


//use() : 모듈을 사용할 수 있도록 만들어주는 메소드
//body-parser를 사용해 application/x-www-form-urlencoded 파싱
app.use(bodyParser.urlencoded({extended: false}));


//body-parser를 사용해 application/json 파싱
app.use(bodyParser.json());


//public 폴더를 static으로 오픈
app.use('/public', static(path.join(__dirname, 'public')));


//public 폴더를 static으로 오픈
app.use(cookieParser());


//세션 설정
app.use(expressSession({
    secret : 'my key',
    resave : true,
    saveUninitialized : true
}));

//데이터베이스연결!!!!!!!!

var MongoClient = require('mongodb').MongoClient;

//데이터베이스 객체를 위한 변수 선언
var database;

//데이터베이스 연결
function connectDB(){
    //데이터베이스 연결 정보
    //형식 : mongobd://%IP정보%:%포트정보%/%데이터베이스이름%
    var databaseURL = 'mongodb://localhost:27017/local';

    //데이터베이스 연결
    //connect(연결URL, callback함수)
    MongoClient.connect(databaseURL, function(err, db){

        if (err) throw err;

        console.log('데이터베이스에 연결되었습니다. : ' + databaseURL);

        //database 변수에 할당
        //mongodb 3.0이상일 경우 DB이름 명시 필수!
        database = db.db('local');
    });
}


//라우팅 함수
//라우터 객체 참조
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;
	
    console.log('요청 파라미터 : ' + paramId + ', ' + paramPassword);
    
    // 데이터베이스 객체가 초기화된 경우, authUser 함수 호출하여 사용자 인증
	if (database) {
		authUser(database, paramId, paramPassword, function(err, docs) {
			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='/mongoDB/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='/mongoDB/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();
	}
	
});



//라우터 객체 등록
app.use('/', router);


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

    //database.collection : 'users' 컬렉션 참조
    var users = database.collection('users');

    //아이디와 비밀번호 사용하여 검색하기
    users.find({"id" : id, "password" : password}).toArray(function(err,docs){
        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);
        }


    });
}

//===== 404 오류 페이지 처리 =====//
var errorHandler = expressErrorHandler({
    static:{
        '404' : 'public/404.html'
    }
});

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


//===== EXPRESS 서버 시작 =====/
http.createServer(app).listen(app.get('port'), function(){

    console.log('서버가 시작되었습니다. 포트 : ' + app.get('port'));

    //데이터베이스 연결
    connectDB();
});

 

1. MongoClient를 사용하여 노드와 몽고디비를 연결시킨다.

==>MongoClient.connect(데이터베이스 주소, 콜백함수) 를 사용한다!

2. 사용자 인증 함수 생성

=> 몽고디비에서 생성된 'users' 컬렉션을 가져와서 변수에 담아준 다음

변수.find()함수를 사용해 요청된 값을 객체에 담아준다. 그러면 요청된 값과 디비에 있는 데이터들을 비교한다!

 

 

콜백함수 아직 어려운거 같다..

 

'Nodejs 공부하기!' 카테고리의 다른 글

router함수!  (0) 2020.12.01
미들웨어 종류!  (0) 2020.11.29
parse(), format(), querystring.stringify()  (0) 2020.08.23