我正在尝试使用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的异步特性有关,因此我尝试使我的函数处于等待状态,但这并没有帮助。
我在做什么错了?
答案 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);