将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模块。

正如你所说,由于查询function是异步的,你不能直接返回结果给调用者。 传统上在nodejs中调用者传递一个回调函数来处理结果或错误(如果有的话)。

在Kotlin这将看起来像:

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

为了使这个有点整齐你可以把你的结果处理程序在自己的function

 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客户端function很有用:

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

postgres客户端然后可以被初始化如下:

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