在函数中返回 postgresql 查询结果



我现在正在开发一个带有expressjs,kotlin和PostgreSQL的Web API。我以面向对象的方式组织我的项目。我还为数据库创建了一个类,该类使所有经常调用的查询都可用作函数。例:

fun addUser(firstName: String, lastName: String, password: String, classId: Int){
client.query("INSERT INTO users(first_name, last_name, password, class_id) values($1, $2, $3, $4)", arrayOf(firstName, lastName, password, classId));
}

但是,当我尝试发出 SELECT 查询并将数据集返回给函数调用者时,这不起作用,因为查询是异步的。我已经尝试将结果分配给数据库对象的属性并在分配值后立即使用它,但是当我永久检查其值时,似乎无法分配该值。有谁知道如何将值返回给函数调用者?

提前感谢您的回答。

假设你使用的是nodejs和pg模块。

正如您所说,由于查询函数是异步的,因此您无法将结果直接返回给调用方。传统上,在nodejs中,调用方传递一个回调函数来处理结果或错误(如果有(。

在 Kotlin 中,这看起来像:

client.query(MY_QUERY_TEMPLATE, params) { err, result ->
if (err != null) {
// do something with the error
} else {
// do something with the result
}
}

为了使它更整洁一些,您可以将结果处理程序放在其自己的函数中

fun handleResult(err: dynamic, result: dynamic) {
// put your code here
}

并像这样使用它:

client.query(MY_QUERY_TEMPLATE, params, ::handleResult)

如果你不喜欢这样,你还有另一种选择。pg库可以返回Promise。此抽象允许您使用如下所示的方法链:

app.get("/promiseStyle") { req, res ->
val params = arrayOf(42) // or something...
fun handleSuccess(result: dynamic) {
for (row in result.rows) {
res.write(row.someField)
}
res.end()
}
fun handleError(error: dynamic) {
res.status(500).send("Something went wrong");
}
client.query(MY_QUERY_TEMPLATE, params)
.then(::handleSuccess)
.catch(::handleError)
}

您可能会发现以下声明对于访问各种 pg 客户端功能很有用:

@JsModule("pg")
external object pg {
class Client {
fun query(query: String, params: Array<Any>): dynamic
fun query(
query: String, params: Array<Any>, cb: (dynamic, dynamic) -> Unit
)
fun connect()
}
}

然后可以按如下方式初始化 postgres 客户端:

val client = pg.Client()
client.connect()

最新更新