Estoy configurando un sistema que consultará una base de datos MySQL para registrar y eliminar personal y demás. Me preguntaba si es necesario tener la consulta en un bloque try catch o si simplemente es redundante. Tengo un ejemplo a continuación. Tengo entendido que esto arrojará un error pero no bloqueará el sistema como lo hará, como lo hace un intento/captura, detecta el error y deja que el servidor siga funcionando.
var con = mysql.createConnection({ host: 'mysql1', user: 'root', database: 'assignment', password: 'admin' }); let sqlQuery = `INSERT INTO CBOdb (staffName, staffID, staffPassword, time) VALUES ('${staffName}', '${staffID}', '${staffPassword}', NOW())`; try { con.query(sqlQuery, function(err, result) { if (err) { throw err; } else { res.send(0) } }) } catch { res.send(1) //"**Error ecounterd, staff not registerd**\nPlease contact system Administrator.") }¿Es un Try/Catch redundante en esta consulta MySQL de Node.js?
Sí, es innecesario. Los errores de la consulta no se comunican a través de excepciones síncronas que puede detectar con try/catch . Se comunican a través del argumento err a la devolución de llamada.
Como se mencionó en los comentarios, hay un par de versiones diferentes del módulo mysql para nodejs. Está utilizando la versión original basada en devoluciones de llamada simples. Hay otra versión del módulo llamada mysql2 que admite promesas y esto le brinda algunas formas más modernas de llamar a mysql y manejar errores usando promesas, await y try/catch .
Aquí hay un ejemplo del uso de await y captura de errores con try/catch usando la interfaz mysql2/promise.
const mysql = require('mysql2/promise'); app.get("/somePath", async (req, res) => { // this needs to be inside an async function so you can use await const con = await mysql.createConnection({ ... }); let sqlQuery = `INSERT INTO CBOdb (staffName, staffID, staffPassword, time) VALUES ('${staffName}', '${staffID}', '${staffPassword}', NOW())`; try { const result = await con.query(sqlQuery); res.send(0) } catch(e) { console.log(e); res.send(1); //"**Error ecounterd, staff not registerd**\nPlease contact system Administrator.") } });