【发布时间】:2011-09-29 15:53:42
【问题描述】:
我有一个 Node.js/Express 应用程序,它在路由中查询 MySQL 数据库并将结果显示给用户。我的问题是如何在将用户重定向到他们请求的页面之前运行查询并阻止直到两个查询都完成?
在我的示例中,我有 2 个查询需要在呈现页面之前完成。如果我将查询 2 嵌套在查询 1 的“结果”回调中,我可以让查询同步运行。但是,当查询数量增加时,这将变得非常复杂。
如何在不将后续查询嵌套在先前查询的“结果”回调中的情况下同步运行多个(在本例中为 2)数据库查询?
我查看了 Node 模块中的“流控制/异步好东西”并尝试了 flow-js,但我无法让它与异步查询一起使用。
下面列出的是我尝试从“/home”路由执行的 2 个查询。 Node 专家能否解释一下这样做的“正确”方法。
app.get('/home', function (req,res) {
var user_array = [];
var title_array = [];
// first query
var sql = 'select user_name from users';
db.execute(sql)
.addListener('row', function(r) {
user_array.push( { user_name: r.user_name } );
})
.addListener('result', function(r) {
req.session.user_array = user_array;
});
// second query
var sql = 'select title from code_samples';
db.execute(sql)
.addListener('row', function(r) {
title_array.push( { title: r.title } );
})
.addListener('result', function(r) {
req.session.title_array = title_array;
});
// because the queries are async no data is returned to the user
res.render('home.ejs', {layout: false, locals: { user_name: user_array, title: title_array }});
});
【问题讨论】:
-
我 .. 呃 ...我认为您这样做完全错误...重点是异步性。它实际上是一个更好的编程模型。您对 node.js 的用途有任何了解吗?它允许您使用事件回调来减少单个线程上的自旋时间,从而更多地利用系统。我真的建议您采用“在回调中做事”模型,因为这就是意图。或者切换到 Ruby。
-
那么您将如何进行多个异步查询并将数据返回到 EJS 视图?
-
因此,如果我必须执行 10 个查询,我会将每个查询堆叠/嵌套在前一个回调中吗?这不会很快变得令人费解吗?
-
是的,有这种方法。相反,您想知道如何让数据库将 10 个结果集作为一个查询返回?
-
是的,您要查询哪个平台?不应该有所作为,但可以。这是原始 sql
select * from customers; select * from products;
标签: database node.js synchronous