Estoy tratando de usar la clase de transacción del paquete mssql de nodejs. Entonces, mientras leía en http://www.dotnetcurry.com/nodejs/1238/connect-sql-server-nodejs-mssql-package , hice lo siguiente:
Db.prototype.transaction = function() { return new Promise((resolve, reject) => { pool.connect().then(conn => { let transaction = new mssql.Transaction(conn).begin().then(() => { new mssql.Request(transaction).query("SELECT * FROM ParkingSlot").then(() => { transaction.commit().then((recordset) => { conn.close(); resolve(recordset); }).catch(reject) }).catch(reject); }).catch(reject) }); }); }; En la función de llamada, hice db.transaction().then(console.dir); para generar cualquier resultado en una consola. Pero no pasa nada.
Es porque alguna función de mssql que usé en las cadenas no devolvió nada, por lo que cuando la promesa está pendiente, funcionará sin nada, como se puede ver en la cadena catch en la llamada principal.
En segundo lugar, para usar mssql de nodejs con transacciones, la conexión debe estar siempre abierta (en mi caso, en el constructor) y solo tengo que lidiar con transacciones.
Finalmente, no tengo que crear mi solicitud o transacción con un nuevo objeto. La nueva instancia puede ser recuperada por ConnectionPool::transaction o ConnectionPool::Request
Así que aquí está el código final:
transaction(q) { return new Promise((resolve, reject) => { let t = connexion.transaction() t.begin().then(() => { let r = t.request(); r.query(q).then((recordset) => { //console.log(recordset) t.commit().then((re) => { conn.close(); }).catch(reject); resolve(recordset); }) }); }); }Tenga en cuenta que la sintaxis del código es diferente, porque paso la sintaxis de clase ES6, mejor legible.