지난포스트 (deprecated)/NodeJS (deprecated)

Node.js + Express + MongoDB 사용하기

.log('FE') 2018. 12. 20. 17:38
728x90
반응형

 



1. DatabaseExample 폴더생성
2. app.js 파일 생성
3. $ npm init
4. 모듈 설치
$ npm install express http path body-parser cookie-parser serve-static errorhandler express-error-handler express-session mongodb --save

 

app.js 기본세팅

 

// 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'),
errorHandler = require('errorhandler');


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

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

// Express 객체 생성
var app = express();

// 기본속성 설정
app.set('port', process.env.PORT || 3000);

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

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

// cookie-parser 설정
app.use(cookieParser());

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

// 라우터 객체 참조
var router = express.Router();

// 로그인 라우팅 함수 - 데이터베이스의 정보와 비교
router.route('/process/login').post(function(req, res) {
console.log('/process/login 호출됨');
});

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

// ======== 404 오류 페이지 처리 ========
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(`서버가 시작되었습니다 PORT: ${app.get('port')}`);
})

 

 

 

MongoDB 모듈 사용하여 로그인 기능 만들기

 

mongo 명령어 입력하여 몽고디비 쉘로 접속

 

$ cls // cmd 화면 clear
$ use local
$ db.users.remove({name:/소녀/}) // 소녀 가 들어간 데이터 모두 삭제
$ db.users.find().pretty() // 정보가 삭제되었는지 확인
$ db.users.insert({id: 'test01', name: 'codeReading', password: '1234'}) // 데이터 입력
$ db.users.find().pretty() // 입력한 데이터 확인

 

 

app.js

 

// 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')
, errorHandler = require('errorhandler');


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

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

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


// 기본 속성 설정
app.set('port', process.env.PORT || 3000);

// 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')));
// cookie-parser 설정
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, {useNewUrlParser : true}, function(err, client) {
        if (err) throw err;
        
        console.log('데이터베이스에 연결되었습니다. : ' + databaseUrl);
        
        // database 변수에 할당
        database = client.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='/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 authUser = function(database, id, password, callback) {
    console.log('authUser 호출됨 : ' + id + ', ' + password);
    
// 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 { // 조회한 레코드가 없는 경우 콜백 함수를 호출하면서 null, null 전달
         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();
});

 

 

login.html

 

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>로그인 테스트</title>
</head>
<body>
<h1>로그인</h1>
<form method="post" action="/process/login">
아이디 <input type="text" name="id"><br/>
비밀번호 <input type="password" name="password"><br/>
<input type="submit" value="전송">
</form>
</body>
</html>

 

 

이렇게 하면 쉘에서 등록했던 데이터와 입력된 데이터를 비교하여 정상적으로 입력하였다면 아이디와 사용자 명이 출력되고

 

없는데이터라면 일치하는 사용자를 찾지 못했다고 출력합니다.

 

이 코드를 작성하면서 몇가지 이슈가 있었는데 MongoDB 의 버전 문제였습니다.

 

Issue

 

// 데이터베이스 연결
    MongoClient.connect(databaseUrl, {useNewUrlParser : true}, function(err, client) {
        if (err) throw err;
        
        console.log('데이터베이스에 연결되었습니다. : ' + databaseUrl);
        
        // database 변수에 할당
        database = client.db('local');
    });

 


- {useNewUrlParser : true} 이 부분이 항상 함께 추가되어야 한다는것과

- database = client.db('local'); 여기의 형태가 원래는 database = db 였습니다.

- 현재 사용되는 최신버전에서는 위와같이 사용해야 제대로 DB 정보를 읽어옵니다.

 

 

 

사용자 추가 기능 만들기

 

app.js 사용자 추가 함수

 

// 사용자를 추가하는 함수
var addUser = function(database, id, password, name, callback) {
console.log(`addUser 호출됨 : ${id}. ${password}, ${name}`);


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


// id , password, username 을 사용해 사용자 추가
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);
})
}


app.js 사용자 추가 라우팅 함수

 

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}`);
// 데이터베이스 객체가 초기화된 경우, addUser 함수 호출하여 사용자 인증
    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.write('<h2>데이터베이스 연결 실패</h2>');
        res.end();
    }
    
});

 

 

public/adduser.html

 

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>사용자 추가 테스트</title>
</head>
<body>
<h1>사용자 추가</h1>
<form action="/process/adduser" method="post">
아이디 : <input type="text" name="id" /><br/>
비밀번호 : <input type="password" name="password" /><br/>
사용자명 : <input type="text" name="name" /><Br/>
<input type="submit" value="전송" name="" />
</form>
</body>
</html>

 

 

Mongoose

 

NoSQL 데이터베이스 중 하나인 몽고디비를 사용하면 문서 객체 안에 들어가는 속성을 마음대로 바꿀 수 있어 유연하게 데이터 저장이 가능하지만 여러개의 문서객체를 조회할때는 제약이 있을 수 있기 때문에 관계형 데이터베이스처엄 조회조건을 공통 적용하기 어려운 점이 있다.

 

그래서 스키마를 만들고 그 스키마에 따라 문서 객체를 저장하는것이 편한데 이때 사용하는것이 몽구스 모듈

 

이 모듈을 사용하면 스키마에 맞는 모델을 만들어서 데이터를 손쉽게 저장하거나 조회하는것이 가능

 

 

app.js

 

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

// 몽고디비 모듈 사용
var mongoose = require('mongoose');


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

var UserSchema;

var UserModel;

//데이터베이스에 연결
function connectDB() {
// 데이터베이스 연결 정보
var databaseUrl = 'mongodb://localhost:27017/local';


// 데이터베이스 연결
console.log('데이터베이스 연결을 시도합니다.');
mongoose.Promise = global.Promise;
mongoose.connect(databaseUrl);
database = mongoose.connection;


database.on('error', console.error.bind(console, 'mongoose connection error'));
database.on('open', function () {
console.log(`데이터베이스에 연결되었습니다. : ${databaseUrl}`);


// 스키마 정의
UserSchema = mongoose.Schema({
id: {
type: String,
required: true,
unique: true
},
name: {
type: String,
required: true
},
password: {
type: String,
required: true
}
});
console.log('UserSchema 정의함');


// UserModel 정의
UserModel = mongoose.model('users', UserSchema);
console.log('UserModel 정의함');
});


database.on('disconnected', function () {
console.log('연결이 끊어졌습니다. 5초후 다시 연결합니다.');
setInterval(connectDB, 5000);
})
}

 

데이터베이스 연결 부분의 코드를 수정하였습니다.

 

몽구스 디비로 데이터베이스를 연결하였고 그에따라 스키마와 모델이 추가되고 Promise 를 사용합니다

 

데이터베이스의 연결 방식이 바뀜에 따라 해당하는 정보를 출력하는 함수들의 내부 코드도 수정되어야 합니다.

 

app.js

 

var authUser = function (database, id, password, callback) {
console.log(`authUser 호출됨 : ${id}, ${password}`);

// 아이디와 비밀번호를 사용해 검색
UserModel.find({
"id": id,
"password": password
}, function (err, results) {
if (err) {
callback(err, null);
return;
}


console.log(`아이디 ${id}, 비밀번호 ${password}로 사용자 검색결과`);
console.dir(results);


if (results.length > 0) {
console.log(`일치하는 사용자 찾음 ${id}, ${password}`);
callback(null, results);
} else {
console.log('일치하는 사용자를 찾지못함');
callback(null, null);
}
})
};

// 사용자를 추가하는 함수
var addUser = function (database, id, password, name, callback) {
console.log(`addUser 호출됨 : ${id}. ${password}, ${name}`);

// userModel 의 인스턴스 생성
var user = new UserModel({
"id": id,
"password": password,
"name": name
});

// save()로 저장
user.save(function (err) {
if (err) {
callback(err, null);
return;
}
console.log('사용자 데이터 추가함');
callback(null, user);
});
}

 

데이터베이스의 연결코드와 그 출력문의 코드만 변경되었기 때문에 동작은 이전과 동일하게 동작합니다.

 

 

code-reading 블로그에 방문해 주셔서 환영합니다.
댓글은 모두 환영하니 많이 달아주세요.

 

 

 

 

728x90
반응형

'지난포스트 (deprecated) > NodeJS (deprecated)' 카테고리의 다른 글

Node.js + Express + MongoDB CRUD 만들기  (0) 2018.12.28
nodeJS + Express + mongoose REST API 제작  (0) 2018.12.28
express 파일 모듈화 방법  (0) 2018.12.27
My Node.js Tutorial  (0) 2018.12.20
노드란?  (0) 2018.12.18