본문 바로가기

공부/Node.js

[Node.js] express로 웹 서버 만들기(MongoDB)

이러쿵 저러쿵 사실 저번에 적은 내용을 한 번 더 적을 생각은 없고 간단하게 결과만 보고 넘어가려고 한다.

 

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

var bodyParser = require('body-parser')
    , cookieParser = require('cookie-parser')
    , static = require('serve-static')
    , errorHandler = require('errorhandler');

var expressErrorHandler = require('express-error-handler');
var expressSession = require('express-session');

var app = express();

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

app.use(bodyParser.urlencoded({ extended : false }));

app.use(bodyParser.json());

app.use(express.static(__dirname));

app.use(cookieParser());

app.use(expressSession({
    secret : 'my key',
    resave : true,
    saveUninitialized:true
}));

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

var database;

function connectDB(){
    var databaseUrl = 'mongodb://localhost:27017/local';
    
    MongoClient.connect(databaseUrl, function(err, db){
        if (err) throw err;
        
        console.log('데이터베이스에 연결되었습니다. : ' + databaseUrl);
        
        database = db;
    });
};

var authUser = function(database, id, password, callback){
    console.log('authUser 호출');
    
    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);
        }
    });
}

var addUser = function(database, id, password, name, callback){
    console.log('addUser 호출');
    
    var users = database.collection('users');
    
    users.insertMany([{"id":id, "password":password, "name":name}], function(err, result){
        if (err){
            callback(err, null);
            return;
        }
        
        if(result.insertedCount >0){
            console.log("사용자 레코드 추가됨 : " + result.insertedCount);
        } else{
            console.log("추가된 레코드가 없음.");
        }
        
        callback(null, result);
    });
}

var router = express.Router();

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;
    
    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.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.wrute('<h2>데이터베이스에 연결 실패</h2>');
        res.end();
    }
})

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(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='/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();
    }
});

app.use ('/', router);

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

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

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

 

일단 app의 코드이다. 이전 포스팅과 동일 하다 다른 점이 있다면 이전 포스팅에서는 이미지로 포스팅을 했고 여기는 코드블럭으로 했다는 소소한 차이...

 

 

 

일단 이렇게 아이디 비밀번호 사용자명으로 사용자를 추가한다.

 

 

왼쪽은 로그이다. 로그를 보면 id와 이름을 보면 어떻게 자료가 들어갔는지 확인 할 수 있다.

 

로그인 시에도 find()를 써서 로그인하기 때문에 그에 맞는 로그가 나오도록 구성하였다.

 

처음부터 다시한지 2일 만에 여기까지 왔다 확실히 속도가 빨라진거 보면 코딩 자체의 속도가 올라간 것 같기도 하다.