gpt4 book ai didi

node.js - 使用 pg-promise 进行同步编程

转载 作者:搜寻专家 更新时间:2023-10-31 22:20:47 25 4
gpt4 key购买 nike

我是 node.js 和 pg-promise 的新手,来自 synchronis 编程背景,它需要一种新的思维。

我将从在主程序逻辑之前运行数据库初始化的场景开始。

下面这个例子: https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#simple-select

db.any("select * from users where active=$1", [true])
.then(function (data) {
// success;
})
.catch(function (error) {
// error;
});

我的代码会读作:

db.query("DELETE FROM records")
.then(function (data) {
// success;
console.log("This is where all my main logic goes");
})
.catch(function (error) {
// error;
});

或者它会读作:

db.query("DELETE FROM records")
.then(function (data) {
// success;
})
.catch(function (error) {
// error;
});
console.log("This is where all my main logic goes");

我的理解是,对于后者,消息将在记录被删除之前显示。

更新:在阅读了大量关于 promises 和回调的文章后,我了解到 pg-promise 使用链接 .then 和 .catch 来处理成功和错误场景。我现在也相信我理解 pg-promise 命令应该放在函数包装器中,例如:

function initialiseDB() {
db.query("DELETE FROM records")
.then(function (data) {
// success;
})
.catch(function (error) {
// error;
});
}

然后在我的代码中,我将使用一个异步运行该函数的简单命令来调用该函数:

initialiseDB();

然而,我仍然不确定异步编码和 promises 的概念如何适应程序的整体结构,因为程序中的几乎所有内容肯定都需要先完成初始化。因此,整个程序不需要放在函数的“.then”部分吗?也就是说,顶层的唯一代码实际上是 intialiseDB() 函数?

// Start of code here 
var pgp = require('pg-promise')();

//Configure the database connection
var config = {
user: 'username', //env var: PGUSER
database: 'database', //env var: PGDATABASE
password: 'password', //env var: PGPASSWORD
};

var db = pgp(config);

function initialiseDB() {
db.query("DELETE FROM records")
.then(function (data) {
// This is where the main program logic goes after this line;
})
.catch(function (error) {
// error;
});
}

// Commence the program here
initialiseDB();

最佳答案

PG promise 实际上允许在较新的 nodejs 版本上使用 generatorsasync/awaitGenerators 需要一个带有 promises 的适配器,该 promises 非常重要地内置于系统中,因此提供 generator 函数 将允许以同步方式实现更清晰的代码流

Taken from the repository under the tag task

没有生成器:

db.task(t => {
// this.ctx = task config + state context;
return t.one('SELECT * FROM users WHERE id = $1', 123)
.then(user => {
return t.any('SELECT * FROM events WHERE login = $1',user.name);
});
})
.then(events => {
// success;
})
.catch(error => {
// error;
});

使用生成器:

db.task(function * (t) {
// this.ctx = task config + state context;
let user = yield t.one('SELECT * FROM users WHERE id = $1', 123);
return yield t.any('SELECT * FROM events WHERE login = $1', user.name);
})
.then(events => {
// success;
})
.catch(error => {
// error
});

如果使用async/await,您可以简单地将function * (t)替换为async function (t) yieldawait 两者的工作原理大致相同。

一些注意事项:

在更复杂的逻辑中,您应该围绕可能失败的事物使用 try catch block ,因为它们会在 generatorsasync/await 中冒泡错误

db.task(function * (t) {
yield Promise.reject(new Error('This will cause your app to error')
}

You should also pay close attention to his pg-promise demo!它会教给您很多很棒的东西,例如扩展事件、存储库、外部 SQL 文件,以及库中的许多其他很棒的东西,例如助手!

关于node.js - 使用 pg-promise 进行同步编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38692553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com