[英]Query results do not load properly (Node.js / Postgresql)
我在理解為什么所有查詢在沒有setTimeout()
情況下無法加載或部分加載時遇到了一些麻煩。 這是使用setTimeout()
/ MINIMAL_QUERY_TIMEOUT = 58 / 的代碼:
router.get('/test', (request, response, next)=>{
var db_user1 = loadUserByUniqueProperty("username", "CoolUsername12");
// I really dont know why, but it's not working any other way; 58 is the minimal timeout
setTimeout(()=>{
console.log(db_user1);
var messages = getAllMessagesForCurrentUser(db_user1.db_id);
setTimeout(()=>{
console.log(messages);
}, MINIMAL_QUERY_TIMEOUT*3); // <-------- PART 2
}, MINIMAL_QUERY_TIMEOUT); // <---------- PART 1
response = setResponseTypeToTextHtml(response);
response.send("Loaded");
});
輸出很好:
User {
names: 'Some Weird Names',
username: 'CoolUsername12',
password: undefined,
email: 'supermail@mail.com',
address: 'Sofia, Lyulin 7, blok 723',
country: 'Bulgaria',
allMessagesIds: [],
unreadMessagesIds: [],
sentMessagesIds: [],
isOnline: true,
password_hash: '400f2078117282506e65969aaf77eea338cd05d4eb2fde26289c5007d489b5a7',
db_id: 7
}
[
sentMessages: [
{
id: 2,
content: 'Hello brato!',
timesent: 2019-12-11T14:28:08.980Z,
isanswered: false,
senderid: 7,
recieverid: 7
}
],
recievedMessages: [
{
id: 2,
content: 'Hello brato!',
timesent: 2019-12-11T14:28:08.980Z,
isanswered: false,
senderid: 7,
recieverid: 7
}
],
unreadMessages: [
{
id: 2,
content: 'Hello brato!',
timesent: 2019-12-11T14:28:08.980Z,
isanswered: false,
senderid: 7,
recieverid: 7
}
]
]
查詢代碼:
function getAllMessagesForCurrentUser(userId){
var ret = Array();
var psql_for_sent = "SELECT * FROM message_test WHERE senderid = " + userId + ";";
var psql_for_recieved = "SELECT * FROM message_test WHERE recieverid = " + userId + ";";
var psql_for_not_answered = "SELECT * FROM message_test WHERE recieverid = " + userId + " AND isanswered = 'f';"
client.query(psql_for_sent).then(
res=>{
ret['sentMessages'] = res.rows;
}
).catch(err=>console.error(err));
client.query(psql_for_recieved).then(
res =>{
ret['recievedMessages']= res.rows;
}
).catch(err=>console.error(err));
client.query(psql_for_not_answered).then(
res=>{
ret['unreadMessages']= res.rows;
}
).catch(err=>console.error(err));
return ret;
}
function loadUserByUniqueProperty(property, property_content){
var user = new User();
var psql = "SELECT * FROM users_test WHERE "+ property + " = '" + property_content + "';"
client.query(psql).then(
res=>{
res = res.rows[0];
user.setNames(res['names']);
user.setAddress(res['address']);
user.setCountry(res['country']);
user.setEmail(res['email']);
user.setUsername(res['username']);
user.isOnline = true;
user.setPassword(undefined);
user.password_hash= res['password_hash'];
user.db_id = res['id'];
}).catch(err=>console.error(err));
return user;
}
但是,當省略第1部分(標記以上),或第2部分(也被標記上文)較小或也省略,我得到undefined
作為輸出,或部分輸出(如recievedMessages
或unreadMessages
丟失); 所以,問題是:我怎樣才能避免這種情況? 當我需要它們時,我如何確定它們都已加載?
PS:我使用的是遠程Heroku數據庫 (postgres),每個表最多包含 2 行。
您應該使用異步等待。 超時起作用的原因是因為您的承諾需要一些時間來解決,IE 從 postgres 接收數據。
router.get('/test', async (request, response, next)=>{
const db_user1 = loadUserByUniqueProperty("username", "CoolUsername12");
const messages = await getAllMessagesForCurrentUser(db_user1.db_id);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.