使用CouchDB和nano.js进行callback和返回

我试图用nano重新编写一个可重用的数据库调用库。

db.view('list', 'people', function(error, data) { if (error == null) { res.render('people/index', { people: data.rows }); } else { // error } }); 

有多个请求时,这可能会相当混乱:

 db.view('list', 'people', function(error, people) { db.view('list', 'items', function(error, items) { db.view('list', 'questions', function(error, questions) { db.view('list', 'answers', function(error, answers) { ... res.render('people/index', { people: people.rows, items: items.rows, questions: questions.rows ... 

所以,这个想法是创build一个函数:

 var getPeople = function() { // do db calls here and return } res.render('people/index', { people: getPeople() }); 

但是这不起作用。

我怎样才能解决这个问题,并把所有东西都放到一个外部节点-js-module.js文件中?

你已经有了很好的答案

从纳米源代码你有一个例子可能有所帮助:

另外,如果你真的不明白如何nodejsstream量控制的作品,我不能build议你看到这个教程不够,

比使用工具更好的是使用工具了解它是如何工作的:)也许你会最终编写自己的控制stream程,这就是我们大多数人最终做的事情。

希望这有助于,附上代码方便。

  var db = require('nano')('http://localhost:5984/emails') , async = require('async') ; function update_row(row,cb) { var doc = row.doc; delete doc.subject; db.insert(doc, doc._id, function (err, data) { if(err) { console.log('err at ' + doc._id); cb(err); } else { console.log('updated ' + doc._id); cb(); } }); } function list(offset) { var ended = false; offset = offset || 0; db.list({include_docs: true, limit: 10, skip: offset}, function(err, data) { var total, offset, rows; if(err) { console.log('fuuuu: ' + err.message); rows = []; return; } total = data.total_rows; offset = data.offset; rows = data.rows; if(offset === total) { ended = true; return; } async.forEach(rows, update_row, function (err) { if(err) { console.log('something failed, check logs'); } if(ended) { return; } list(offset+10); }); }); } list(); 

我会build议caolan的aysnc图书馆。 非常容易使用,它可以在浏览器和沙发上使用require(而不是在沙发侧用来查询)。

对于特定的问题,你可以使用系列或瀑布:

您是否考虑过在CouchDB中对视图进行查看整理? 这将帮助您减lessdb.view(..)调用的次数,并返回1视图查询中所需的所有数据。 单个一对多(即“人”有许多“项目”)是相当容易的。 这可能是多层次的更多努力,但它应该以同样的方式工作。 这里有一些关于沙发视图整理的好文章:

CouchDBjoin

CouchDB视图整理

我所知道的最好的解决scheme是使用承诺 。 这需要一点点习惯,但它是非常值得的努力。 我正在使用Kris Kowal的Q库 。 他在JSConf-2010 上对Q API和devise进行了很好的介绍(跳到15:30)。