Это имеет некоторые серьезные проблемы, в основном в концептуальном плане.
Во-первых, forEach
является синхронным, будет вызываться payments.length
количество раз, но SQL-запрос является асинхронным, поэтому он будет выполнен в будущем.
Я думаю, что вы запутались между синхроннымии асинхронные функции и как они работают.
Но вы можете решить это (в вашем случае) по крайней мере двумя способами.
1) Используйте синтаксис IN и получите массив.Итерируйте и делайте вещи."SELECT PolicyNo from pinclientinfo WHERE PolicyNo in (...)"
let sql = 'SELECT PolicyNo from pinclientinfo WHERE PolicyNo IN (' + Array(req.body.payments).fill('?').join(',') + ')'
const policies = req.body.payments.map(p => p.PolicyNo);
const values = [];
const failedvalues = [];
connection.query(sql, ...policies, (err, rows) => {
//now check each row..
rows.forEach(element => {
//Not optimized only depicts logic
///do stuff
/// like fill values and failedvalues
if(policies.indexOf(element.PolicyNo) > -1){
values.push(...)
}else{
failedvalues.push(...)
}
});
res.json({
failed: failedvalues,
success: values
})
})
Это будет вызов из 1 БД.
2) Другой подход (не очень хороший) - выполнять несколько вызовов в БД и проверять счет.
let sql = 'SELECT PolicyNo from pinclientinfo WHERE PolicyNo=?'
let count = 0;
req.body.payments.forEach(element => {
connection.query(sql, element.PolicyNo, (err, rows) => {
if (!err) {
if (rows && rows.length > 0) {
values.push(element.PolicyNo, element.PaymentDate)
} else {
failedvalues.push(element.PolicyNo)
}
}
// check If all Complete
count+=1;
if(count === req.body.payments){
//all complete
res.json({
failed: failedvalues,
success: values
})
}
})
})
НО СЕРЬЕЗНО, ИСПОЛЬЗУЙТЕ PROMISE
.ИСПОЛЬЗОВАТЬ ASYNC/AWAIT
ИСПОЛЬЗОВАТЬ ЭТИ ОСОБЕННОСТИ СЛАДКОГО ES6 ДАЕТ ВАМ
Проверить: этот пост