2013-06-27 7 views
0

Я работаю над проектом node.js, в котором мне нужно установить связь с базой данных mongoDb. В настоящее время я программирую функцию, чтобы найти некоторые данные в моем db, используя собственный модуль node-mongodb. Все работает, но мой код выглядит как обратный вызов в обратном вызове в обратном вызове в обратном вызове ...

Я создал эту функцию, чтобы предотвратить использование обратных вызовов каждый раз, когда я хочу получить доступ к моей базе данных. Теперь мне просто нужно вызвать эту функцию.
Обработка функций обратного вызова

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

Почему вы не объявляете переменную в своей основной функции и не назначаете для нее db, коллекцию и курсор и сразу возвращаетесь из своих внутренних обратных вызовов! таким образом вы можете избежать обратного вызова в обратном направлении. – 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 (', но теперь ti throws: Невозможно вызвать метод 'collection' undefined – Maxime

+0

oh! Извините, может быть плохо! Да, конечно, я буду исправьте это! – Boynux

2

Если вы просто хотите знать, как очистка обратных вызовов разумно и область применения БД:

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'), потому что оно вернуло 'Невозможно вызвать метод 'open' undefined', но после этого небольшого редактирования это сработало :) – Maxime