티스토리 뷰

반응형

부제: Node.js Nosql 연동법.


 Node.js의 mongodb모듈을 활용하여 mongodb를 연동하는 도중



 라는 오류를 마주쳤다. 한참을 헤맨 끝에 간단히 해결되었지만, 나같은 고민을 하는 사람들이 더 쉽게 고민을 해결했으면 하는 마음에 삽질로그를 남긴다.


 먼저, 내가 간단하게 만들어본 프로그램은 화면에서 id와 password를 입력받아 DB에 존재하는지 검증하고, 로그인 성공여부를 보여주는 기능을 한다. db연동은 아래와 같이 했다. 먼저 DB연결하는 function이다.


//
// 기본 모듈 선언 및 미들웨어 선언 생략
var MongoClient = require('mongodb').MongoClient;
var db; // 연결 받아올 변수(중요)

function connectDB() {
    var databaseUrl = 'mongodb://localhost:27017/local';
    
    MongoClient.connect(databaseUrl, function(err, database) {
        if(err) throw err;
        
        console.log('데이터베이스에 연결됨: '+databaseUrl);
        db = database; /*이부분 주목*/
    });
}

 mongodb 모듈을 사용했다. 그뒤 connect함수로 DB 연결을 시도했다. 당연히, DB연결은 잘 되었다. 아래 코드는 'users' Collection을 가져와 입력값과 비교해보는 function이다.


// users collection 비교 function
var authUser = function(database, id, password, callback) {
    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) {
            // 일치하는 값 찾음.            
        } else {
            // 일치하는 값 없음.
        }
    });
}

 내친김에 Router 코드도 소개하겠다.


// router function
app.post('/process/login', function(req, res){
    
    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) {
                // 결과가 있음. 로그인 성공
            } else {
                // 결과가 없음. 로그인 실패
            }
        });
    } else {
        // db변수가 없음. db연결 오류
    }    
}); 


 별 문제가 없어보였지만, 이 글의 처음에 보여줬던 에러(db.collection is not a function)가 발생했다. 구글링을 해본 결과, 아래와 같은 힌트를 얻었다.


 In mongodb version >= 3.0, That database variable is actually the parent object of the object you are trying to access with database.collection('whatever'). To access the correct object, you need to reference your database name, for me that was by doing


mongodb 버전 3.0이상을 사용할 때는, connection을 할 때에 database명을 명시해야 한다는 것이다. 그래서 DBConnection 하는 부분을 아래와 같이 바꿔봤다.


var MongoClient = require('mongodb').MongoClient; var db; // 연결 받아올 변수(중요) function connectDB() { var databaseUrl = 'mongodb://localhost:27017/local'; MongoClient.connect(databaseUrl, function(err, database) { if(err) throw err; console.log('데이터베이스에 연결됨: '+databaseUrl); db = database.db('local'); /*database명을 명시했다.*/ }); }


 위와 같이 database명을 명시해주니 아주 간단하게 해결되었다. mongodb 사용시 버전에 유의하여 사용해야겠다.





-끝-





출처

https://stackoverflow.com/questions/43779323/typeerror-db-collection-is-not-a-function



반응형
최근에 올라온 글
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함
Total
Today
Yesterday