簡體   English   中英

(node/express) 從數據庫查詢中收集多條數據並發送到 index.ejs?

[英](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 }); });

但這並沒有因為承諾/同步方法(我認為)而起作用,因為它只是告訴我它正在等待承諾(或類似的東西,我不太記得了)。 我嘗試使用一些等待的東西作為修復,但沒有任何效果。 (或者我沒有正確實施)

那么最好的方法是什么? 我想過:

  1. 構建一個函數來進行所有必要的查詢,聲明變量,然后使用所有這些變量在最后呈現頁面(我認為這是 await/async 工作的地方?)

  2. 以某種方式將所有查詢結果組合到一個對象中,然后將所有數據與該單個對象一起發送,然后在客戶端對其進行排序/分類/顯示。 (或者只是將整個數據庫發送給客戶端,但這似乎是一個壞主意)

但我不確定執行其中任何一項的最佳方法。 任何幫助將不勝感激,我是 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.

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