2013-06-27 2 views
0

mongoDb 데이터베이스와 통신해야하는 node.js 프로젝트에서 작업 중입니다. 현재 DB에서 node-mongodb-native 모듈을 사용하여 데이터를 찾는 함수를 프로그래밍하고 있습니다. 모든 것은 작동하지만 내 코드는 콜백 콜백 콜백 콜백과 같습니다 ...

데이터베이스에 액세스 할 때마다 콜백을 사용하지 못하도록이 함수를 만들었습니다. 이제이 함수를 호출하면됩니다.
콜백 함수 처리

module.exports.find = function(query, projection, callback){ 
    db.open(function(err, db){ 
     if(err) throw err; 
     db.collection('rooms', function(err, collection){ 
      if(err) throw err; 
      collection.find(query, projection, function(err, cursor){ 
       if (err) throw err; 
       cursor.toArray(function(err, find){ 
        db.close(); 
        callback(err, find); 
       }); 
      }); 
     }); 
    }); 
}; 

codeception을 줄일 수있는 방법이 있습니까? 이처럼

+0

가 [비동기] (https://github.com에서보세요/caolan/async) –

+0

main 함수에서 변수를 선언하고 db, collection 및 cursor를 할당하고 내부 콜백에서 즉시 반환하는 이유는 무엇입니까? 이렇게하면 콜백 인 콜백을 피할 수 있습니다. – Boynux

+0

@Boynux, 이렇게 : var database = db.open (function (err, db) { if (err) throw err; return db; }); – Maxime

답변

0

:

module.exports.find = function(query, projection, callback){ 
    var database; 

    db.open(function(err, db_temp){ 
     if(err) throw err; 

     database = db_temp; 
    }); 

    database.collection('rooms', function(err, collection){ 
     if(err) throw err; 
     collection.find(query, projection, function(err, cursor){ 
      if (err) throw err; 
      cursor.toArray(function(err, find){ 
       db.close(); 
       callback(err, find); 
      }); 
     }); 
    }); 
}; 
+0

그다지 좋아 보이지 않고 동기식 인'.open '에 의존합니다. – Bergi

+0

코드를 테스터로 검사하면 오류가 발생합니다 : 정의되지 않은'open '메서드를 호출 할 수 없습니다. 'var db'를'var database'와'database.collection (')으로 변경 한 후, 이제는 throws : 정의되지 않은 – Maxime

+0

의 메소드 'collection'을 호출 할 수 없습니다! 죄송합니다. 물론 가능합니다. – Boynux

2

그냥 방법을 정리 합리적으로 콜백 및 범위 DB를 알고 싶은 경우 :

module.exports.find = function(query, projection, callback){ 
    var local_db; 

    function db_open(err, db) { 
     if(err) throw err; 
     local_db = db; 
     local_db.collection('rooms', handle_homes_collection); 

    } 

    function handle_homes_collection(err, collection){ 
     if(err) throw err; 
     collection.find(query, projection, handle_find_query); 
    } 

    function handle_find_query(err, cursor){ 
     if (err) throw err; 
     cursor.toArray(function(err, find){ 
      local_db.close(); 
      callback(err, find); 
     }); 
    } 

    db.open(db_open); 
}; 
+1

+1 : 각 기능에 이름을 부여하는 것은 그것이하는 일을 문서화하는 아주 좋은 방법이다. 익명의 기능을위한 장소가 있지만 깊이있는 중첩을한다면 깊은 이름을 붙일 필요가 있습니다.) – slebetman

+0

전적으로 동의합니다! –

+0

감사합니다. 그것은 효과가있다! 방금'db.open'을 다른 변수 이름 ('database.open')으로 변경해야했습니다. 'Can not call method'open 'undefined'를 반환 했으므로,이 작은 편집 후에는 :) – Maxime