es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo usar una segunda consulta en una Promesa en JavaScript? utilizando una base de datos MySQL

Básicamente tengo un “createorder” que necesita agregar la orden a la base de datos y todos los productos en la orden a una tabla adicional de Orderline.

He estado intentando diferentes formas de hacer que la segunda consulta funcione, pero lo único que se inserta en la base de datos es la información de la primera consulta.

La segunda consulta también necesita usar el ID de la orden insertada en la primera consulta, ya que la base de datos utiliza autoincremento para el ID de la orden.

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);
                        }
                    });
                });
            },
        }
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para agregar pedidos y productos relacionados a una base de datos utilizando MySQL Auto increment

    Para insertar productos para el pedido en la tabla Orderline, necesitamos usar el id del pedido insertado de la primera consulta. Podemos lograr esto utilizando result.insertId devuelto por la primera consulta.

    Sin embargo, el problema con el código proporcionado es que la segunda consulta está dentro de la función de devolución de llamada de la primera consulta, y no se ejecuta en el orden correcto. Esto significa que la segunda consulta se ejecuta antes de que la primera consulta haya terminado, y result.insertId aún no está disponible.

    Para solucionar este problema, necesitamos mover la segunda consulta dentro de la función resolve de la primera consulta. Luego, podemos pasar result.insertId a la segunda consulta como un parámetro.

    Aquí está el código actualizado:

    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 {
              const orderId = result.insertId; // Obtener orderId de la primera consulta
              const product = req.body.producten;
              // Insertar producto para el pedido en la tabla Orderline
              db.query(
                sqlInsert2,
                [orderId, product.id, product.cartQuantity, product.price],
                (err, result, fields) => {
                  if (err) {
                    reject(err);
                  } else {
                    resolve(result);
                  }
                }
              );
            }
          }
        );
      });
    },
    

    En el código actualizado, primero ejecutamos la primera consulta para insertar los datos del pedido en la tabla orders. Si no hay errores, obtenemos orderId de result.insertId, y luego ejecutamos la segunda consulta para insertar los productos para el pedido en la tabla orderline utilizando orderId y otros datos del producto de req.body.producten.

    De esta manera, nos aseguramos de que la segunda consulta se ejecute después de que la primera consulta haya terminado, y result.insertId esté disponible para ser utilizado en la segunda consulta. De esta manera, tanto el pedido como los productos para el pedido se insertarán correctamente en la base de datos.

Comments are closed.