Javascript事件序列,pg,postgresql,为什么?

Javascript事件序列,pg,postgresql,为什么?,javascript,json,postgresql,express,pg,Javascript,Json,Postgresql,Express,Pg,我正在尝试用express编写一个javascript文件,以便与postgresql数据库通信。更准确地说,我想编写一个函数,将SQL作为输入参数并返回字符串化的json。考虑到这些表的大小,我可以假设内存不是问题。这是为私人企业制作内部使用工具的有偿工作 我最近的尝试涉及将值放入全局变量的查询回调,但即使这样也失败了,因为最外层的函数在定义json字符串之前返回。以下是相关代码: var dbjson; function callDB(q) { pg.connect(connect

我正在尝试用express编写一个javascript文件,以便与postgresql数据库通信。更准确地说,我想编写一个函数,将SQL作为输入参数并返回字符串化的json。考虑到这些表的大小,我可以假设内存不是问题。这是为私人企业制作内部使用工具的有偿工作

我最近的尝试涉及将值放入全局变量的查询回调,但即使这样也失败了,因为最外层的函数在定义json字符串之前返回。以下是相关代码:

var dbjson;

function callDB(q) {
    pg.connect(connectionString, function(err, client, done) {
        if (err) {
            console.error('error fetching client from pool', err);
        } else {
            client.query(q, [], function(err, result) {
                client.query('COMMIT');
                done();
                if (err) {
                    console.error('error calling query ' + q, err);
                } else {
                    dbjson = JSON.stringify(result.rows);
                    console.log('1 ' + dbjson);
                }
                console.log('2 ' + dbjson);
            });
            console.log('3 ' + dbjson);
        }
        console.log('4 ' + dbjson);
    });
    console.log('5 ' + dbjson);
}
我的测试中的SQL是
“从用户中选择id”
。 相关控制台输出为:

5 undefined
GET /db/readTable?table=users 500 405.691 ms - 1671
3 undefined
4 undefined
1 [{"id":1},{"id":2},{"id":3},{"id":4}]
2 [{"id":1},{"id":2},{"id":3},{"id":4}]
为什么控制台日志按顺序出现? 它们在顺序上是一致的

我试图编写一个轮询循环,以等待调用方使用setTimeout设置全局变量,然后在回调中清除超时,但我认为这失败了,因为javascript是单线程的,我的循环不允许其他活动继续。也许我做错了

虽然我知道我可以让每个函数处理自己的数据库连接和错误记录,但我真的不喜欢重复相同的代码

有什么更好的方法可以做到这一点


我对express和javascript相对较新,但对其他语言的经验要丰富得多。

出现以下行将打破一切:

client.query('COMMIT');
您正在尝试以同步方式执行异步命令,并在查询有机会执行之前调用
done()
,释放连接。这种无效断开连接的结果是不可预测的,尤其是在这种情况下,您没有处理任何错误

你为什么要在那里调用
COMMIT
?这本身看起来完全无效
COMMIT
用于关闭当前事务,您甚至没有打开该事务,因此它不存在


在异步代码使用和数据库方面存在一些误解。如果你想在这两方面都有一个好的开始,我建议你看看

出现以下一行将为您打破一切:

client.query('COMMIT');
您正在尝试以同步方式执行异步命令,并在查询有机会执行之前调用
done()
,释放连接。这种无效断开连接的结果是不可预测的,尤其是在这种情况下,您没有处理任何错误

你为什么要在那里调用
COMMIT
?这本身看起来完全无效
COMMIT
用于关闭当前事务,您甚至没有打开该事务,因此它不存在


在异步代码使用和数据库方面存在一些误解。如果你想在这两方面都有一个好的开始,我建议你看看

我相信console.log是按这个顺序出现的,因为
pg.connect
client.query
都是异步的。请注意代码的最新缩进。所有查询/结果处理都是在回调函数中完成的,这意味着
.connect()
将激发、返回并下拉到
5
。然后,当事情开始发生时,代码的其他部分开始运行。e、 g.所有这些代码都是异步的。这是为私人企业制作内部使用工具的有偿工作。。谢谢你透露,谢谢。恐怕我对JS方面了解不够,无法解释这一点。谢谢你的回答。我相信他们是正确的。对于其他任何面临此问题的人,我只是通过在每个需要的函数中重复对数据库的调用来解决这个问题,有时是多层次的。我相信console.log是按这种顺序出现的,因为
pg.connect
client.query
都是异步的。请注意更新后的代码缩进。所有查询/结果处理都是在回调函数中完成的,这意味着
.connect()
将激发、返回并下拉到
5
。然后,当事情开始发生时,代码的其他部分开始运行。e、 g.所有这些代码都是异步的。这是为私人企业制作内部使用工具的有偿工作。。谢谢你透露,谢谢。恐怕我对JS方面了解不够,无法解释这一点。谢谢你的回答。我相信他们是正确的。对于其他任何面临此问题的人,我只是通过在每个需要的函数中重复对数据库的调用来解决这个问题,有时是多层次的。我相信console.log是按这种顺序出现的,因为
pg.connect
client.query
都是异步的。请注意更新后的代码缩进。所有查询/结果处理都是在回调函数中完成的,这意味着
.connect()
将激发、返回并下拉到
5
。然后,当事情开始发生时,代码的其他部分开始运行。e、 g.所有这些代码都是异步的。这是为私人企业制作内部使用工具的有偿工作。。谢谢你透露,谢谢。恐怕我对JS方面了解不够,无法解释这一点。谢谢你的回答。我相信他们是正确的。对于其他任何面临这个问题的人,我只是通过在每个需要它的函数中重复对数据库的调用来解决这个问题,有时是多层次的。