函数未返回pg-pool结果

4
我将使用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 = function() {
  pgPool.pool.query(
    'SELECT * FROM "WordLanguage" ORDER BY id DESC LIMIT 30 ;',
    (error, results) => {
      if (error) {
        throw error;
      }
      return results.rows;
    }
  );
}

如果我在getLatestLanguages()返回results.rows之前放置console.log(results.rows),那么我会在控制台中看到数据记录。
然而,该对象没有被返回给fetchData。我通过在返回数据到exports.getDashboard()之前将returnData记录到控制台来测试它。
我认为我的问题与pg-pool的异步性有关,因此我尝试使用await使我的函数异步,但这并没有帮助。
我做错了什么?
2个回答

2
你需要将getLatestLanguages改为返回一个Promise,这样你就可以在调用者处使用await。最初的回答。
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(),因此 getDashboard 应该是异步的。


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

1

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

fetchData() 是异步的,因此应该使用 await 进行等待。

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

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

请确保以正确的格式返回returnData.languages,而不是...json(returnData);。同时请保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接