본문 바로가기

Node.js공부/Node.js 원활한 사용을 위한 세부 공부

MongoDB 사용하기

반응형

몽고디비 설치가 끝나셨다면, 몽고디비를 사용할 수 있도록 mongodb 모듈을 불러옵니다. 모듈을 불러들이면서 동시에 그 객체 안에 들어있는 MongoClient 속성을 참조할 수 있습니다. 이 객체를 사용해 몽고디비를 사용할 수 있습니다.


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;
});
}


connectDB함수는 mongodb 모듈을 사용해 몽고디비 데이터베이스에 연결하도록 새로 만든것입니다. 데이터베이스에 연결하려면 먼저 연결 정보를 문자열로 정의해야하는데 문자열의 형식은 다음과 같습니다.


mongodb://%IP정보%:%포트정보%/%데이터베이스이름%


앞뒤에 %기호는 우리가 지정해야 하는 정보를 뜻합니다. 앞의 코드에서는 로컬 PC 27017포트에서 실행되고 있는 local 데이터베이스에 연결하도록 연결정보를 만들었습니다.


데이터베이스에 연결하기 위해서는 connect() 메소드를 호출합니다. 연결URL과 콜백함수를 파라미터로 지정합니다. 데이터베이스가 정상적으로 연결되면 db객체가 전달되는데 이 객체는 database변수에 저장합니다. 서버가 실행되면 connectDB 함수를 호출하여 데이터베이스에 연결합니다. 다음과 같이 서버가 시작된 후 호출되는 콜백 함수 안에서 connectDB함수를 호출합니다.


이제 데이터베이스에 연결되었으니 db객체를 사용해 데이터베이스를 사용할 수 있는 상태가 되었습니다.!

사용자가 보내온 아이디와 비밀번호를 사용해 데이터베이스 안에 일치하는 문서 객체가 있는지 조회합니다. 이 기능을 담당하는 authUser함수를 app.js안에 만들어주세요


//사용자 인증 함수
var authUser = function(database, id, password, callback){
console.log('authUser 호출됨');
//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);
}
});
}


authUser() 함수는 데이터베이스 객체, 아이디, 비밀번호를 파라미터로 받으며 콜백 함수도 파라미터로 전달받습니다. 

1) 데이터베이스의 users 컬렉션 안에 사용자 정보가 들어 있으므로 database.collection() 메소드로 users 컬렉션 객체를 참조합니다. 

2) 그다음에는 users 컬렉션 객체의 find() 메소드를 호출하여 데이터를 조회합니다. 

3) id 와 password 속성의 값을 파라미터로 전달하여 조회한 후 조회 결과는 toArray()로 변환된 문서 객체가 전달됩니다. 

4) docs의 값이 0보다 크면 사용자가 데이터가 조회된 것이므로 callback 함수를 호출하면서 docs객체를 파라미터로 전달합니다. 이렇게 함으로써 이 함수르 호출한 쪽에서 콜백 함수를 사용해 docs객체를 전달받을 수 있습니다.


위의 코드를 실행시키기 전에, 커맨드창에서 mongo를 입력한 뒤에 아래와같이 명령어를 따라 입력하여 주세요 :)


그러나,, 아무리 실행해도 페이지를 찾을 수 없다는 에러에 app.js 코드안에서 /process/login 이 두 번 라우팅명시 된 것을 보고 위의 코드는 지웠으나, 또 다른 문제로 database.collection is not a function 에러가 떴다. 구글링 결과, 몽고디비 3.0 이후부터 코드 명시가 달라졌다고 한다. 제가 참고한 자료는 여기입니다 :)


마지막 app.js 코드 공유합니다


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


//express middleware set
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var static = require('serve-static');
var errorHandler = require('errorhandler');

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

//session middleware
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('/public', static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(expressSession({
secret:'my key',
resave: true,
saveUninitialized: true
}));
//라우터 객체 참조
var router = express.Router();

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

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

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

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

var MongoClient = require('mongodb').MongoClient;
var database;
function connectDB(){
var databaseUrl = 'mongodb://localhost:27017';
//몽고디비 3.0부터 바뀜
MongoClient.connect(databaseUrl, function(err, client){
if(err) throw err;
var db = client.db('local');
console.log('데이터베이스 연결되었습니다: '+databaseUrl);
database=db;
});
}

//사용자 인증 함수
var authUser = function(database, id, password, callback){
console.log('authUser 호출됨');
//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);
}
});
}

router.post('/process/login', function(req, res){
console.log('/process/login 호출됨.');
var paramId= req.body.id;
var paramPassword=req.body.password;
if(database){
authUser(database, paramId, paramPassword, function(err, docs){
if(err){throw err;}
if(docs){
console.dir(docs);
var username=docs.id;
res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
res.write('<h1>로그인성공</h1>');
res.write('<div><p>사용자 아이디: '+paramId+'</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("<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();
}
});
http.createServer(app).listen(app.get('port'), function(){
console.log('서버가 시작되었습니다. 포트: '+app.get('port'));
connectDB();
});



반응형