簡體   English   中英

查詢結果加載不正確(Node.js / Postgresql)

[英]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作為輸出,或部分輸出(如recievedMessagesunreadMessages丟失); 所以,問題是:我怎樣才能避免這種情況? 當我需要它們時,我如何確定它們都已加載?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM