[英](node/express) Collecting multiple pieces of data from database queries and sending to index.ejs?
我從 postgres 數據庫中獲取多條信息,並使用它們通過 node.js 中的 express 呈現網頁。
我可以對“測量”數據庫進行一次查詢,然后毫無問題地傳遞它,例如:
pool.query("SELECT * from measurements", (err, result) => {
if(err) {
throw err;
} else {
var set1= JSON.stringify(result);
app.get("/", (req, res) => { res.render("index", { set1: set1}); });
}
});
我的問題是進行多個查詢並將它們一起呈現。 起初,我嘗試將查詢結果存儲在函數外部的單獨變量中,並像這樣傳遞所有變量:
var set1= pool.query("SELECT * from measurements");
var set2= pool.query("DIFFERENT QUERY* from measurements");
app.get("/", (req, res) => { res.render("index", { set1: set1, set2: set2 }); });
但這並沒有因為承諾/同步方法(我認為)而起作用,因為它只是告訴我它正在等待承諾(或類似的東西,我不太記得了)。 我嘗試使用一些等待的東西作為修復,但沒有任何效果。 (或者我沒有正確實施)
那么最好的方法是什么? 我想過:
構建一個函數來進行所有必要的查詢,聲明變量,然后使用所有這些變量在最后呈現頁面(我認為這是 await/async 工作的地方?)
以某種方式將所有查詢結果組合到一個對象中,然后將所有數據與該單個對象一起發送,然后在客戶端對其進行排序/分類/顯示。 (或者只是將整個數據庫發送給客戶端,但這似乎是一個壞主意)
但我不確定執行其中任何一項的最佳方法。 任何幫助將不勝感激,我是 JS 新手
使用async / await
做得好非常簡單:
app.get("/", async (req, res) => {
var set1 = await getMeasurments("SELECT * FORM BLABLA");
var set2 = await getMeasurments("SELECT * FORM BLABLA");
res.render("index", { set1, set2 });
});
function getMeasurments(query) {
return new Promise((res, rej) => {
pool.query(query, (err, result) => {
if (err) {
rej(err);
} else {
res(result);
}
});
});
}
只需創建一個新功能並承諾它
const query = async(query) => {
const client = await pool.connect()
const result = await client.query(query)
client.release()
return result;
})
const requests = [
query("SELECT * from measurements"),
query("DIFFERENT QUERY* from measurements")
]
Promise.All(requests).then(results => {
return results.reduce((acc, curr) => {
return Object.assign(acc, curr)
}, {})
}).then(data => {
res.render("index", data)
})
使用您的初始代碼,您可以首先(1)promisify pool.query
,然后(2)在async
函數中使用await
調用它; 和(3)在你的路線中使用組合函數
const poolquery = util.promisify(pool.query); // (1)
async function renderindex(req,res) { // (2)
try {
let set1 = await poolquery ("SELECT * FROM SET1 ...");
let set2 = await poolquery ("SELECT * FROM SET2 ...");
res.render("index", { set1, set2 });
} catch (err) {
res.status(500).send(err);
}
}
app.get("/", renderindex); // (3)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.