数据库查询本身不是问题--它们工作得很好。
问题是,我需要按顺序执行所有这些命令:
DELETE FROM myTable;
INSERT INTO myTable(c1, c2, c3) VALUES (x, y, z);
SELECT * FROM myTable;
无论我怎么尝试,我都不知道如何在Node中做到这一点。This question似乎是流量最大的解决方案,它会让我做这样的事情(其中client
是from pg
,应该返回承诺):
// client is my database client, has already been initialized
// f is an object corresponding to my database
var res;
Promise.resolve()
.then(() => {
console.log("Deleting");
return client.query("DELETE FROM FileFormat");
})
.then(() => {
console.log("Inserting");
return client.query("INSERT INTO myTable(c1, c2, c3) VALUES ($1, $2, $3)", [f.x, f.y, f.z]);
})
.then(() => {
console.log("Selecting");
return client.query("SELECT * FROM FileFormat").then((err, result) => res = result.rows)
})
.then(() => {
console.log("Finished");
console.log(res);
})
我希望它打印Deleting
,然后是Inserting
,然后是Selecting
,然后是Finished
,然后是我刚刚插入到数据库中的数据。
相反,它打印Deleting
,然后什么也不做。
我不想无限链接client.query.then(client.query.then(...))
,因为这会使我的代码变得任意缩进。我宁愿让我的代码尽可能扁平,并顺序执行这些调用,等待每个调用完成后再开始下一个调用。我该怎么做呢?
2条答案
按热度按时间mcdcgff01#
从我对原始问题的注解中回答
客户端实际上可能没有解析会导致此行为的承诺。如果删除所有client.query,您将看到所有日志看起来都与您预期的一样。您的Javascript代码已经在执行您想要的操作,问题似乎出在PG客户端。
gmxoilav2#
因此,我能够通过遵循此模式在我的ExpressJS应用程序中实现此功能。
本质上,您启动了:
对于ExpressJS,我将我的代码封装在IIFE中(上面没有显示,但仍然在文档中的某个地方)。因此,上面的代码看起来如下所示:
node-postgres指南here.我已经从下面的站点粘贴了代码片段。