2013-06-27 83 views
0

我正在研究一個node.js項目,我需要與mongoDb數據庫進行通信。我目前正在編寫一個函數,使用node-mongodb-native模塊在我的db中查找一些數據。一切正常,但我的代碼看起來像回調中的回調在回調中的回調...

我創建此函數,以防止我每次訪問我的數據庫時使用回調。我現在只需要調用這個函數。
處理回調函數

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,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(',但是現在ti拋出:無法調用未定義的方法'集合' – Maxime

+0

哦!對不起,可能不好!當然,我會修復它! – 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

謝謝!有效!我只需要通過另一個變量名('database.open')來更改'db.open',因爲它返回'Can not call method'open'of undefined',但是在這個小編輯之後它工作:) – Maxime