Получить результат node-postgres в объект вне функции обратного вызова

#javascript #node.js #postgresql

#javascript #node.js #postgresql

Вопрос:

Я переписываю скрипт профилирования данных, который я разработал на python, на javascript, поскольку я следую курсу Wes Bos для начинающих по Javascript.

Итак, это консольный скрипт, который принимает информацию о подключении к базе данных, а также целевую таблицу в качестве входных данных. В конечном итоге он выполнит 9 разных запросов к каждому столбцу, найденному в целевой таблице, и создаст отчет.

Как я могу получить sqlOut, доступный как объект после пула.запрос, чтобы я мог перебирать его и т. Д.

Заранее спасибо.

 const { Pool } = require('pg');

const pool = new Pool({
  user: 'postgres',
  host: 'localhost',
  database: 'pps',
  password: 'XXXX',
  port: 5432,
});

sql = `Select column_name, data_type, character_maximum_length from information_schema.columns where table_name = 'profiling_nws6'`;

let sqlOut = [];

pool.query({ text: sql, rowMode: 'array' }, (err, result) => {
  if (err) {
    return console.error('Error executing query', err.stack);
  }
  // sqlOut.push(result.rows);
  sqlOut = result.rows.slice(0);
  console.log(typeof sqlOut);
  console.log(Array.isArray(sqlOut));
  // console.log(sqlOut);
  // pool.end();
  return sqlOut;
});

// now I want sqlOut available so I can do various things with the data...

console.log(sqlOut);
 

Ответ №1:

При выполнении запроса

 pool.query({ text: sql, rowMode: 'array' }, callback);
 

Обратный вызов выполняется с результатами (или ошибкой)
Но этот обратный вызов может быть выполнен намного позже, чем ваш console.log (и это так, поскольку пул должен подключиться к базе данных, отправить запрос, подождать некоторое время, затем получить результаты вашего запроса и только после этого выполнить ваш обратный вызов.

Вам нужно получить некоторые знания о Promises (или Async / Await), которые помогут вам получить ресурсы из базы данных.

Комментарии:

1. Да, из поиска в Google я знал, что promises или async / await помогут, я просто предположил, что должно быть решение и с подходом обратного вызова. Возможно, нет.

2. Проблема здесь в том, что возврат из обратного вызова нигде не используется. И его выполнение выполняется после вашего console.log