【问题标题】:nodejs, pgSQL and Async queriesnodejs、pgSQL 和异步查询
【发布时间】:2014-07-06 22:54:57
【问题描述】:

我是 nodejs 的新手,我正在尝试从我的 PG 服务器获取一些数据。我设法获取我的数据,但不是按照我预期的顺序。我可能没有正确使用它,有人可以帮忙吗?

这是一个代码示例:

var pg = require('pg');

var db = new pg.Client(conString);
var link = db.connect();

var data = {};

// -----
console.log(prefix+'Fetching categories');
db.query('SELECT DISTINCT category FROM cc WHERE category IS NOT NULL', function(err, data){
    data.rows.forEach(function(row){
        data[row.category] = {}; // initialise
    });
console.log('1111111',data,'---------');
});
console.log('2222222',data,'---------');

for (var category in data)
{
    console.log(prefix+'Listing values for on "'+category+'"');
    var values = db.query('SELECT SUBSTRING(date::varchar, 1,7) AS month, sum(amount) FROM cc WHERE category = \''+category+'\' GROUP BY 1 ORDER BY 1', function(err, data){
        console.log('Got values',data.rows);
    });
}

// -----
console.log(prefix+'Ending connection to database');
//  db.end();

// -----
console.log(prefix+'Ending transaction on server side');
response.end();

我得到222222 before 1111111 :/ 所以我的结果被发送为空然后它被填充:( 我该怎么办?

感谢您的宝贵时间!

【问题讨论】:

  • 当然你在 1111111 之前得到了 222222。这就是异步在节点中的工作方式。您的第一个查询开始然后节点不等待查询完成,只是继续打印 222222。这是非阻塞的,这是节点的一个非常重要的特性。如果要在第一个查询完成后执行第二个查询,则需要将其放在第一个查询的回调中,其中 console.log('1111111',data,'---------');是。

标签: node.js postgresql


【解决方案1】:

看看promise :https://github.com/promises-aplus/promises-spec。 (nodejs 的一个好的库是 q - http://documentup.com/kriskowal/q/).they 对于在所有这些回调中保持 nodejs 代码的连贯和整洁非常有用。每个 nodejs 开发人员都必须这样做。

【讨论】:

    猜你喜欢
    • 2021-03-21
    • 1970-01-01
    • 2020-06-19
    • 2011-08-14
    • 2019-02-08
    • 2014-03-28
    • 2021-10-11
    • 2023-03-26
    • 2020-10-22
    相关资源
    最近更新 更多