【问题标题】:Function not returning pg-pool results函数不返回 pg-pool 结果
【发布时间】:2019-08-13 19:13:56
【问题描述】:

我正在尝试使用 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() 返回 results.rows 之前放置 console.log(results.rows),那么我会将数据记录到控制台。

但是该对象并未返回到 fetchData。我通过在将 returnData 返回到exports.getDashboard() 之前将其记录到控制台来对此进行了测试;

我认为我的问题与 pg-pool 的异步性质有关,因此我尝试使用 await 使我的函数异步,但这没有帮助。

我做错了什么?

【问题讨论】:

    标签: javascript node.js postgresql async-await


    【解决方案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);
                }
              );
        }) 
      }
    

    你还需要await fetchData(),因此getDashboard应该是异步的

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-27
        • 2012-12-27
        • 2020-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多