如何等待第一个查询结果然后在node.js中执行另一个查询

时间:2018-08-17 15:18:37

标签: node.js

我正在用angular&node.js开发一个应用程序。在代码的某个特定点,我需要执行INSERT查询,然后返回insertId,然后将另一个INSERT与上面的insertId一起放入另一个表。但是我总是以0作为insertId,因为它的异步特性使其不等待第一个查询执行。因此,我需要一种变通方法以等待第一个查询结果,然后执行第二个查询。我的代码如下所示。

insert_users_query = `INSERT INTO users xxxxxx`;
connection.query(insert_users_query, (err, result)=>{
    var user_id = result.insertId;
});

second_query = `INSERT INTO another_table (user_id) VALUES('${user_id}')`;
connection.query(linked_accounts_query, (err, result)=>{
// this query saves 0  as user_id in table.
});

我认为可以通过promises完成。但是,由于我是这方面的初学者,并且也阅读了Promises上的一篇文章,但是我无法找到一个简单的解决方案。任何帮助将不胜感激!

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以这样做。

insert_users_query = `INSERT INTO users xxxxxx`;
connection.query(insert_users_query, (err, result)=>{// query 1( getting insertId as result.insertId)
    if(err){
     //handle error
    }else{
    var user_id = result.insertId; // using insertId
    second_query = `INSERT INTO another_table (user_id) VALUES('${user_id}')`;
    connection.query(linked_accounts_query, (err, result2)=>{//query2
  // this query saves 0  as user_id in table.
   }
 });



});

这是通过使用回调完成的,您可以使用await来实现。 基本上,这有点简单,我们将在执行query1之后将err,result作为对象,然后可以在query1中使用query1的err,result运行另一个查询。

答案 1 :(得分:0)

您也可以使用async / await来代替在1st内调用第二个查询,因为当查询数量增加时,第二个查询会造成混乱。

但是由于def menu(): vel = 4 vel_left = 5 vel_right = -5 player = pygame.Rect(40, 45, 30, 30) rotatingrects = [ pygame.Rect(630, 300, 250, 20), pygame.Rect(920, 300, 250, 20) ] walls = [ pygame.Rect(0, 0, 1200, 20), pygame.Rect(0, 0, 20, 600), pygame.Rect(0, 580, 1200, 20), pygame.Rect(1180, 0, 20, 600), pygame.Rect(300, 0, 20, 530), pygame.Rect(20, 100, 230, 20), pygame.Rect(70, 200, 230, 20), pygame.Rect(20, 300, 230, 20), pygame.Rect(70, 400, 230, 20), pygame.Rect(600, 100, 20, 500) ] movingrects = [ MovingRect(320, 120, 30, 30, vel_left), MovingRect(320, 240, 30, 30, vel_left), MovingRect(320, 360, 30, 30, vel_left), MovingRect(570, 180, 30, 30, vel_right), MovingRect(570, 300, 30, 30, vel_right), MovingRect(570, 420, 30, 30, vel_right) ] 返回了回调,因此我们需要将其包装在promise中。

connection.query

您可以调用此通用async function main(){ try{ const insert_users_query = `INSERT INTO users xxxxxx`; const result = await queryDb(insert_users_query); let user_id = result.insertId; const linked_accounts_query = `INSERT INTO another_table (user_id) VALUES('${user_id}')`; await queryDb(linked_accounts_query); } catch(e){ //catch error } } 函数,为所有查询返回queryDb

promise