![](/img/trans.png)
[英]Why the console.log prints to the console "undefined" when I try to add some results in the function?
[英]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));
});
但是,如果我將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.