Я не уверен, какой модуль 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){});
...