Как выполнить запрос только тогда, когда другой завершил с express js - PullRequest
0 голосов
/ 13 марта 2020

Пожалуйста, будь осторожен со мной, я новичок в node js. Я запускаю два запроса в для l oop, который будет вставлять значения в две таблицы с именами заказов и запросов. после вставки в таблицу заказов я беру insertId и передаю его переменной orderid, а затем добавляю ее для второго запроса вставки. Все это прекрасно работает, и когда это будет сделано, я хочу запросить представление с именем invoice, чтобы я мог получить некоторую информацию, которую я просто поместил в базу данных. Проблема в том, что он возвращает результаты из представления еще до того, как два запроса будут выполнены, поэтому я получаю пустой ответ. Это мой код.

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 для l oop. Моя база данных mysql.

1 Ответ

0 голосов
/ 14 марта 2020

Я не уверен, какой модуль SQL npm вы используете, поэтому я не могу сослаться на какую-либо документацию, но я верю, что ваши вызовы connection.query() асинхронны, так как они должны быть. Это приводит к тому, что ваши окончательные значения connection.query() за пределами для l oop будут выполняться раньше, чем значения внутри для l oop, следовательно, у вас не будет requestId для использования в вашем последнем запросе.

Два возможных решения, которые я могу предложить, включают:

  • Вложите ваши запросы в обратные вызовы
  • Используйте явные обещания

Таким образом, для первого варианта вы можете просто поместить последний запрос во вложенный обратный вызов вашего запроса в таблицу requests. Насколько я понимаю, вы только через sh сможете выбрать строки из invoice, как только ваши вставки в orders & requests будут завершены.

Что касается второго варианта, вы можете преобразовать содержимое вашего для l oop во вспомогательную функцию и инкапсулировать его с помощью 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){});
...
...