Básicamente, obtuve un pedido de creación que necesita agregar el pedido a la base de datos, y todos los productos en el pedido en una tabla adicional de Orderline.
He estado probando diferentes formas de hacer que la segunda consulta funcione, pero lo único que se inserta en la base de datos son los datos de la primera consulta.
la segunda consulta también necesita usar la identificación del pedido insertado de la primera consulta. ya que la base de datos usa autoincremento para la identificación del pedido.
CreateOrder: (req) => { return new Promise((resolve, reject) => { const sqlInsert = 'INSERT INTO web3.orders (Created, firstName, lastName, street, number, postalCode, city, telephone, email, totalPrice) VALUES (?,?,?,?,?,?,?,?,?,?);'; const sqlInsert2 = 'INSERT INTO web3.orderline (orderId,productId,qty,price) VALUES (?,?,?,?);'; db.query(sqlInsert, [ req.body.Created, req.body.firstName, req.body.lastName, req.body.street, req.body.number, req.body.postalCode, req.body.city, req.body.telephone, req.body.email, req.body.totalPrice], (err, result, fields) => { if (err) { reject(err); } else { resolve(result); } }); db.query(sqlInsert2, [ result.insertId, req.body.producten.id, req.body.producten.cartQuantity, req.body.producten.price], (err, result, fields) => { if (err) { reject(err); } else { resolve(result); } }); }); }, }Necesitará dos promesas: una para cada consulta. Y el segundo debe crearse solo cuando el primero se haya resuelto.
Una buena manera de hacer esto es db.query en una nueva función, y solo usar esa función a partir de ese momento. Así que define esto primero:
const promiseQuery = (sql, params) => new Promise((resolve, reject) => db.query(sql, params, (err, result, fields) => err ? reject(err) : resolve(result)) ); En segundo lugar, puede hacer que su CreateOrder una función async para que pueda usar await :
async CreateOrder: (req) => { const sqlInsert = 'INSERT INTO web3.orders (Created, firstName, lastName, street, number, postalCode, city, telephone, email, totalPrice) VALUES (?,?,?,?,?,?,?,?,?,?);'; const sqlInsert2 = 'INSERT INTO web3.orderline (orderId,productId,qty,price) VALUES (?,?,?,?);'; let result = await promiseQuery(sqlInsert, [ req.body.Created, req.body.firstName, req.body.lastName, req.body.street, req.body.number, req.body.postalCode, req.body.city, req.body.telephone, req.body.email, req.body.totalPrice ]); await promiseQuery(sqlInsert2, [ result.insertId, req.body.producten.id, req.body.producten.cartQuantity, req.body.producten.price ]); }Prueba esto:
CreateOrder: (req) => { const { Created, firstName, lastName, street, number, postalCode, city, telephone, email, totalPrice } = req.body let results = {} return new Promise((resolve, reject) => { const sqlInsert = 'INSERT INTO web3.orders (Created, firstName, lastName, street, number, postalCode, city, telephone, email, totalPrice) VALUES (?,?,?,?,?,?,?,?,?,?);'; const sqlInsert2 = 'INSERT INTO web3.orderline (orderId,productId,qty,price) VALUES (?,?,?,?);'; db.query(sqlInsert, [Created, firstName, lastName, street, number, postalCode, city, telephone, email, totalPrice], (err, result, fields) => { console.log(result) results.insertId = result.id }); db.query(sqlInsert2, [ results.insertId, req.body.producten.id, req.body.producten.cartQuantity, req.body.producten.price], (err, result, fields) => { if (err) { reject(err); } else { resolve(result); } }); }); }, } Supongo que en su código inicial está resolviendo la promesa en el primer db.query , lo que da como resultado la finalización de la promesa.
el código anterior es correcto, el mismo flujo funciona aquí
async function CreateOrder(req) { const sqlInsert = 'INSERT INTO legs (leg) VALUES (?);'; const sqlInsert2 = 'INSERT INTO destinations (destination,area) VALUES (?,?);'; let result = await promiseQuery(sqlInsert, [ "lw" ]); let res= await promiseQuery(sqlInsert2, [ "test", "test location" ]); console.log(res) } const promiseQuery = (sql, params) => new Promise((resolve, reject) => db.query(sql, params, (err, result, fields) => err ? reject(err) : resolve(result)) ); async function test(){ await CreateOrder() }intente verificar si alguna de las claves no está definida o si hay una discrepancia en el tipo de campo y el valor que está pasando
si req.body.producten es una matriz , debe realizar la consulta para cada iteración
async CreateOrder: (req) => { const sqlInsert = 'INSERT INTO web3.orders (Created, firstName, lastName, street, number, postalCode, city, telephone, email, totalPrice) VALUES (?,?,?,?,?,?,?,?,?,?);'; const sqlInsert2 = 'INSERT INTO web3.orderline (orderId,productId,qty,price) VALUES (?,?,?,?);'; let result = await promiseQuery(sqlInsert, [ req.body.Created, req.body.firstName, req.body.lastName, req.body.street, req.body.number, req.body.postalCode, req.body.city, req.body.telephone, req.body.email, req.body.totalPrice ]); for (let ele of req.body.producten){ await promiseQuery(sqlInsert2, [ result.insertId, ele.id, ele.cartQuantity, ele.price ]); } }