Estoy usando el paquete mssql dentro de una función azul... tratando de realizar escrituras secuenciales en una base de datos dentro de una sola transacción. El objetivo es que las transacciones se reviertan si hay un error en cualquiera de ellas. Esto parece estar funcionando con el siguiente código, pero no puedo averiguar cómo devolver si la transacción es exitosa/revertida (y, en última instancia, comunicar esto al cliente). He mirado la documentación de la transacción para mssql pero solo tienen ejemplos para una solicitud ÚNICA. No múltiples solicitudes. ¿Cuál es la mejor manera de hacer esto?
En el siguiente código, Request2 es la solicitud que se supone que fallará debido a una falta de ortografía en el nombre de la tabla. Como dije, parece que la reversión está ocurriendo porque NINGUNA escritura está ocurriendo. Además, el 'error al confirmar la transacción' se registra en la consola... pero no puedo enviar este error a la función azul para luego responder al cliente correctamente. Solo quiero poder detectar un error en la etapa trasaction.commit() y luego devolverlo, pero parece que context.res se está ejecutando de inmediato. ¿Cómo puedo solucionar esto? Obviamente no entiendo las propiedades asíncronas correctamente. ¿Alguien tiene un buen ejemplo de cómo ejecutar consultas secuenciales en una transacción con el nodo mssql? No puedo encontrar ningún buen ejemplo en línea.
const runQuery = async () => { var errors = []; let pool = await sql.connect(sqlConfig); const transaction = new sql.Transaction(pool); transaction.begin(async (err) => { let rolledBack = false; transaction.on("rollback", (aborted) => { console.log("rolledback"); rolledBack = true; }); const request = new sql.Request(transaction); request.query( "insert into categories (category) values ('Test ')", async (err, result) => { if (err) { console.log("error 1"); errors.push(err); // return "error in req1"; if (!rolledBack) { console.log("rollback 1 below"); await transaction.rollback((err) => { console.log("rolling back 1"); }); } } const request2 = new sql.Request(transaction); request2.query( "insert into adjustment values ('AAA', 0)", async (err, result) => { if (err) { console.log("error 2"); errors.push(err); if (!rolledBack) { console.log("rollback 2 below"); await transaction.rollback((err) => { console.log("rolling back"); // console.log(err); }); } } transaction.commit((err) => { if (err) { console.log("error in committing transaction"); return "error"; // console.log(err); } else { return "success"; } }); } ); } ); });};
const queryResult = await runQuery();
context.res = { cuerpo: resultado de la consulta, }; };
Después de manejar el error devuelto por commit(), su función debería devolver el código y el mensaje de error. Luego puede completar la respuesta de la siguiente manera,
context.res = { status: queryResult.responseCode, body : queryResult.mesg}; Por ejemplo, la función runQuery() podría devolver 400 como código de responseCode y "Algo salió mal, detalles del error" como mesg . También puede registrar sus errores de modo que pueda encontrar mensajes de registro y seguimiento en la hoja de Application Insights para su aplicación de funciones. Para que pueda depurar fácilmente lo que sucedió dentro de su código. Consulte esta documentación para registrar errores.