簡體   English   中英

如果使用pg時,如果我從函數返回查詢結果,返回未定義,但是如果我用控制台記錄它,它就會打印出來呢?

[英]How come when using pg if i return the result of my query from a function, it returns undefined, but if i console log it, it prints?

這是我的代碼:

  const queryFirstNames = function (qString) {
    let firstNameMatches;
    client.query('SELECT * FROM famous_people WHERE first_name = $1', [qString], (err, result) => {
      if (err) {
        return console.error('error running query', err);
      }

      firstNameMatches = result.rows;
      return firstNameMatches;
      client.end();
   });
 };

 console.log(queryFirstNames(qString));
});

此代碼返回undefined,並且不會終止與數據庫的連接

但是,如果我將console.log firstNameMatches放在函數內部而不是返回,然后在沒有控制台日志記錄的情況下直接調用該函數,則會得到所需的結果,並且數據庫連接將正確關閉。

我想做的是返回此查詢的結果並在另一個函數中使用它,因此我不希望它控制台記錄結果,但是當我嘗試返回結果時,它給我未定義的內容,並且沒有關閉數據庫連接。

我相信您遇到的問題是,當您返回firstNameMatches時,您只是將其返回到client.query的回調中。 firstNameMatches是在queryFirstNames函數的上下文內設置的,但是您永遠不會將其返回。 話雖如此,您還利用了對client.query的異步調用。 這意味着當您從queryFirstNames函數返回時,很有可能您還沒有完成查詢。 因此,我很確定您想利用承諾來管理此事件或其他事件之一。

除此之外,您還需要將退貨移至client.end之前。 為了解決我的問題,我創建了一個jsfiddle,您可以在這里看到。 我不得不通過Promise創建自己的諾言,只是為了模擬執行查詢的客戶端。

  const queryFirstNames = function (qString) {
    let firstNameMatches;
    client.query('SELECT * FROM famous_people WHERE first_name = $1', [qString])
    .then((result) => {

      firstNameMatches = result.rows;
      client.end();
      return firstNameMatches;
    })
    .then(f => {
        console.log(f);
    })
    .catch(e => {
      if (err) {
        return console.error('error running query', err);
      }
    });
  };

您在執行client.end()之前就已經返回了呼叫。 這樣,您的客戶端連接將永遠不會結束。 您可以執行以下操作:

const query = client.query(
    'SELECT * FROM famous_people WHERE first_name = $1',
    [qString], 
    (err, result) => {
        if (err) {
            return console.error('error running query', err);
        }
    });

    query.on('row', (row) => {
      results.push(row);
    });

   // After all data is returned, close connection and return results
    query.on('end', () => {
        return res.json(results);
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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