我如何解决在NodeJS和sqlite-3中深度嵌套的callback?

我一直在掌握节点和node-sqlite3,需要根据多个查询构build一个报告:

var db = require('./db'); module.exports = { getActivity : function (user_id, done) { var report = {}; db.get('SELECT * FROM warehouse WHERE user_id = ?', user_id, function (err, warehouse) { report.warehouse = warehouse; db.all('SELECT * FROM shops WHERE warehouse_id = ?', report.warehouse.id, function (err, shops) { report.shops = shops; return done(report); }); }); } }; 

我的目标是能够从路由生成报告并将其序列化为JSON响应。 以下是我的路线:

 app.get('/api/hello', auth.check, function(req, res) { hello.getActivity(1, function (data) { res.send(data); }); }); 

我将很有可能在这个报告中包含更多的查询,因此更多的嵌套callback。 我有什么select可以避免这种情况? 我熟悉承诺等,但node-sqlite没有内置任何东西来清理这些东西。 也许我使用不正确?

最后,我正在通过路线的“完成”callback。 也许这是做事情的节点方式,但如果我只是简单地返回报告,而没有callback,这将是非常好的。 有更好的模式吗?

任何帮助感激!

我有一个build立在节点上的报表引擎,它具有多个查询的相同问题。 为了保持清醒,我使用asynchronous,这是一个了不起的控制stream库: https : //github.com/caolan/async#series

你会想看看async.series。 它使您的代码比大量embedded式函数更简洁。

注意:您将需要创build一个引用,您需要从async.series上下文的一个步骤访问下一个外部的variables。 例如,我使用函数中的var一个两个:

 //keep context to shared values outside of the async function var one, two; async.series([ function(callback){ // do some stuff ... one = 'one'; callback(null, one); }, function(callback){ //!access value from previous step two = one + one; callback(null, two); } ], // optional callback function(err, results){ // results is now equal to ['one', 'oneone'] });