节点Mysqlasynchronous多个查询

我想知道什么是最好的方式来处理嵌套的mysql查询是nodejs。

所以像这样的东西:

connection.query("SELECT * FROM blogs ORDER BY time DESC", function(err, blogs, fields) { for (blog in blogs) { connection.query("SELECT * FROM tags WHERE blog_id='blog.id' ", function(err, tags, fields) { blog.tags = tags }); } res.send(blogs) }); 

由于asynchronous性质,这显然不起作用。 获取标签之前,结果已经返回。

我一直在阅读节点和callback,承诺似乎是要走的路。 但是我无法看到在这个小例子中我将如何最好地使用它们。

谢谢!

因此,在发送回复之前,您必须等待所有回传。 如果我们为了简单而忽略error handling和空结果,可以这样做:

 var callback = function(blogs) { res.send(blogs); } connection.query("SELECT * FROM blogs ORDER BY time DESC", function(err, blogs, fields) { var pending = blogs.length; for (blog in blogs) { connection.query("SELECT * FROM tags WHERE blog_id='blog.id' ", function(err, tags, fields) { blog.tags = tags; if (0 === --pending) { callback(blogs); } }); } }); 

承诺,看看Promise.all函数返回一个新的承诺。 当所有承诺传递给数组时,这个承诺就被解决了。 Q库应该是这样的:

 var getTags = function(blog) { var deferred = Q.defer(); connection.query("SELECT * FROM tags WHERE blog_id='blog.id' ", function(err, tags, fields) { blog.tags = tags; deferred.resolve(); }); return deferred.promise; } var promises = blogs.map(getTags(blog)); Q.all(promises).then(res.send(blogs)); 

您可以使用async.series模块(遍历查询)

 async.eachSeries(blogs, function (query, callback) { connection.query(blogs.blog, "SELECT * FROM tags WHERE blog_id='blog.id'" , function (err, result) { if (err) { //throw err; callback(err, null); return; } else { console.log('Query executed successfully'); blogs.blog.tags = tags; } callback(null, blogs.blog); }); }, function finalCallback(err, results) { return callback(null, results); }); } }); }); });` 

你可以使用和query.onfunction来加强它(处理每一行)

你可以尝试这样的事情;

 connection.query("SELECT * FROM blogs ORDER BY time DESC", fetchedBlogs); function fetchedBlogs(err, blogs, fields) { if (err || !blogs || !blogs.length) { // an error occurred or no blogs available // handle error or send empty blog array return res.send(); } var count = blogs.length; (function iterate(i) { if (i === count) { // all blogs processed! return res.send(blogs); } var blog = blogs[i]; connection.query("SELECT * FROM tags WHERE blog_id='" + blog.id + "'", fetchedTags); function fetchedTags(err, tags, fields) { blog.tags = tags; iterate(i+1); }); })(0); } 

希望这可以帮助。