函数不返回pg-pool结果

时间:2019-03-22 18:23:26

标签: javascript node.js postgresql async-await

我正在尝试使用pg-pool查询Postgresql数据库。然后将这些数据导出到Node.js Express Rest API。

这是我的导出功能。

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;
    }
  );
}

如果我在getLatestLanguages()返回result.rows之前放置console.log(results.rows),那么我会将数据记录到控制台。

但是该对象没有返回给fetchData。我通过将returnData记录到控制台进行测试,然后将其返回到exports.getDashboard();

我相信我的问题与pg-pool的异步特性有关,因此我尝试使我的函数处于等待状态,但这并没有帮助。

我在做什么错了?

2 个答案:

答案 0 :(得分:2)

您需要getLatestLanguages返回一个Promise,以便您可以从呼叫者那里等待它

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 :(得分:1)

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);