簡體   English   中英

僅當另一個使用 express js 完成時如何運行查詢

[英]How to run a query only when another has completed with express js

請對我溫柔一點,我是 node js 的新手。 我在 for 循環中運行兩個查詢,將值插入到名為 orders 和 requests 的兩個表中。 在插入到 orders 表后,我將 insertId 傳遞給變量 orderid,然后將其添加到我的第二個插入查詢中。 一切正常,完成后我想查詢一個名為發票的視圖,以便我可以獲得一些我剛剛放入數據庫的信息。 問題是它甚至在兩個查詢完成之前就從視圖中返回結果,因此我得到一個空響應。 這是我的代碼。

for(var i = 0; i<items.length; i++){
  connection.query('INSERT INTO orders(referenceid,itemid,quantity,dac,requestid,locationid) VALUES(?,?,?,?,?,?);',[referenceid,items[i].id,items[i].quantity,dac,requestid,locationid], function(errors,results,fields){
                if(errors){ throw errors};
                    var orderid = results.insertId;
                connection.query('INSERT INTO requests(requestid,orderid,price) VALUES(?,?,?)',[requestid,orderid,price],function(errors,results,fields){
                })
  })

}
connection.query('SELECT * FROM invoice WHERE requestid = ? ,[requestid],function(errors,results,fields){
                })

所以任何人都可以幫助我讓 SELECT 查詢僅在 for 循環中的所有插入都完成時運行。 我的數據庫是mysql。

我不確定您使用的是哪個 SQL npm 模塊,因此我無法參考任何文檔,但我相信正在發生的事情是您對connection.query()調用是異步的,因為它們應該是異步的。 這會導致在 for 循環外的最終connection.query()在 for 循環內的那些之前執行,因此,您將沒有requestId在最終查詢中使用。

我可以立即提供的兩種可能的解決方案包括:

  • 將您的查詢調用嵌套到回調中
  • 使用明確的承諾

因此,對於第一個選項,您可以將最終查詢放入requests表中查詢的嵌套回調中。 根據我的理解,您只希望在插入ordersrequests完成后從invoice選擇行。

至於第二個選項,您可以將 for 循環的內容重構為輔助函數,並使用return new Promise()封裝它,如下所示:

const helper = (<any_params_you_need>) => {
   return new Promise(resolve, reject) => {
      for(var i = 0; i<items.length; i++){
         connection.query('INSERT INTO orders(referenceid,itemid,quantity,dac,requestid,locationid) VALUES(?,?,?,?,?,?);',[referenceid,items[i].id,items[i].quantity,dac,requestid,locationid], function(errors,results,fields){
                if(errors) { reject(err); }
                var orderid = results.insertId;
                connection.query('INSERT INTO requests(requestid,orderid,price) 
                VALUES(?,?,?)', 
                [requestid,orderid,price],function(errors,results,fields){
                    resolve(results);
                })
         })
      }
   }
}

一旦你設置了輔助函數,你就可以像這樣使用await調用它: await helper(); 在您選擇查詢之前。 例如,在調用函數中,它看起來像:

...
const results = await helper();
connection.query('SELECT * FROM invoice WHERE requestid = ? ,[requestid],function(errors,results,fields){});
...

暫無
暫無

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

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