Функция не возвращает результаты pg-pool - PullRequest
4 голосов
/ 22 марта 2019

Я пытаюсь использовать pg-pool для запроса базы данных Postgresql. А затем экспортируйте эти данные в API экспресс-отдыха Node.js.

Вот моя функция экспорта.

exports.getDashboard = function(req, response, next) {
  let returnData = fetchData();
  return response.status(200).json(returnData);
};

Что вызывает fetchData ();

fetchData = async function() {
    let returnData = [];
    returnData.languages = await getLatestLanguages();
    return returnData;
};

Какие вызовы getLatestLanguages ​​()

getLatestLanguages = function() {
  pgPool.pool.query(
    'SELECT * FROM "WordLanguage" ORDER BY id DESC LIMIT 30 ;',
    (error, results) => {
      if (error) {
        throw error;
      }
      return results.rows;
    }
  );
}

Если я помещу console.log(results.rows) до того, как getLatestLanguages ​​() вернет results.rows, я получу данные, записанные на консоль.

Однако объект не возвращается в fetchData. Я проверил это, зарегистрировав returnData на консоль, прежде чем он будет возвращен в exports.getDashboard ();

Я считаю, что моя проблема связана с асинхронной природой pg-pool, поэтому я попытался сделать свою функцию асинхронной с ожиданием, но это не помогло.

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 23 марта 2019

вам нужно getLatestLanguages, чтобы вернуть обещание, чтобы вы могли ждать его от звонящего

getLatestLanguages = function() {
    return new Promise((resolve, reject) => {
        pgPool.pool.query(
            'SELECT * FROM "WordLanguage" ORDER BY id DESC LIMIT 30 ;',
            (error, results) => {
              if (error) {
                reject(error);
              }
              resolve(results.rows);
            }
          );
    }) 
  }

вам также нужно await fetchData(), поэтому getDashboard должно быть асинхронным

exports.getDashboard = async function(req, response, next) {
  let returnData = await fetchData();
  return response.status(200).json(returnData);
};
1 голос
/ 23 марта 2019

getLatestLanguages() должен вернуть обещание.Например,

getLatestLanguages = function() {
  return new Promise((resolve, reject) => {
    pgPool.pool.query(
      'SELECT * FROM "WordLanguage" ORDER BY id DESC LIMIT 30 ;',
      (error, results) => {
        if (error) {
          reject(error);
        }
        resolve(results.rows);
      }
    );
  });
};

fetchData() является асинхронным и поэтому его следует ожидать

exports.getDashboard = async function(req, response, next) {
  let returnData = await fetchData();

  return response.status(200).json({ languages: returnData.languages });
};

Также убедитесь, что вы вернули returnData.languages в правильном формате, как указано выше, вместо ...json(returnData);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...