javascript - 查询结果未正确加载(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);
});
推荐阅读
- architecture - 如何以分布式模式(在多台机器上)安装 Hyperledger Fabric 网络
- javascript - 使用 svgs 在织物中导出到 SVG 与画布不匹配
- .net - 从目录加载文件并添加到组合框
- reactjs - 是否可以为 React Native 中的动画分配一个值(id)?
- php - 如何将一个巨大的数组分成块?
- c# - 从全名中删除中间名,并以大写字母开头
- asp.net - 如何取消对文本框数据的任何更改
- netsuite - 是否有强制在 Netsuite 中打开/保存的自动化方法
- questasim - 设置 Questa Sim 双击编辑器
- delphi - 运行时粗体 ListView 项目在 Delphi Tokyo 中不起作用