Возвращает результат запроса postgresql в функции

Я сейчас работаю над веб-API с expressjs, kotlin и PostgreSQL. Я организовал свой проект объектно-ориентированным способом. Я также создал класс для базы данных, который делает все часто называемые запросы доступными как функции. Пример:

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 вызывающая сторона передает функцию обратного вызова для обработки результата или ошибки, если таковая имеется.

В Котлине это выглядело бы так:

  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() 
Intereting Posts
Как добавить расширение оператора как часть контекста конкретного класса без подкласса? Конструктор, принимающий конструктивный конструктор в производном классе Котлин Увеличивает ли Android Studio 3.0 информацию о параметрах запроса? Google Espresso: удалять данные пользователя по каждому тесту Получение абсолютного пути к файлу из содержимого URI для найденных изображений Наблюдает личную окончательную ошибку Inject Log4j2 не работает с файлом конфигурации json Ошибка: Kotlin: несколько значений недопустимы для опции плагина. Org.jetbrains.kotlin.kapt: output Записать вызов / транзакцию в TransactionalEventListener Kotlin – Понимание Getters и Setters Как передать двоичный массив в качестве аргумента функции в Котлине Обнаружение молчания в аудиофайле (amr) с использованием Java / Kotlin на устройствах Android Android Espresso – как запустить настройку только один раз для всех тестов Приложение Kotlin не показывает мой json-массив Как я могу использовать обратный вызов в Котлине?