首页 > 解决方案 > 查询结果未正确加载(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输出,或部分输出(喜欢recievedMessagesunreadMessages缺失);所以,问题是:我怎样才能避免这种情况?当我需要它们时,如何确保它们都已加载?

PS:我使用的是远程Heroku数据库(postgres),每个表最多包含 2 行。

标签: javascriptheroku

解决方案


您应该使用异步等待。超时起作用的原因是因为您的承诺需要一些时间才能解决,IE 从 postgres 接收数据。

router.get('/test', async (request, response, next)=>{
    const db_user1 = loadUserByUniqueProperty("username", "CoolUsername12");
    const messages = await getAllMessagesForCurrentUser(db_user1.db_id);


});

推荐阅读