2013-06-27 77 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