En esta sección vamos a aprender cómo eliminar elementos de la base de datos. En el caso específico de los empleados. Esta consulta es muy similar a obtener un único empleado, solo que en lugar de buscarlo, vamos a eliminarlo. Para poder realizar la consulta en SQL tendría que ser de esta forma:
DELETE FROM employee WHERE id = 2
Si esta consulta se hace directamente en la base de datos, tendría que buscar la tabla y pegar esta línea en la pestaña SQL. Esta misma consulta la vamos a hacer desde la función y para esto vamos a ir al archivo employees.controller.js y buscamos la siguiente línea:
const deleteEmployees = (req, res) => res.send('eliminando empleados')
Acá como hicimos con las otras rutas vamos a eliminar la función y vamos a colocar unas llaves en lugar de la función quedando de la siguiente manera:
const deleteEmployees = (req, res) => {
}
Para eliminar elementos de la base de datos, vamos a utilizar el método query()
que nos trae el objeto pool
, es decir, la conexión a nuestra base de datos y colocamos el siguiente código:
console.log(req.params.id)
const result = await query('DELETE FROM employee WHERE id = ?', [req.params.id])
res.send('empleado eliminado')
Esta función cuando me devuelva un valor lo voy a recibir en una constante llamada result
. En las consultas anteriores nos devolvía múltiples rows
, pero ahora no va a devolver lo mismo.
Entonces vamos a ver qué es lo que devuelve, mientras vamos a ver por consola el valor de result
.
Pero antes tenemos que definir el parámetro id en la ruta como hicimos antes cuando necesitamos obtener un empleado en específico a partir de su id
.
Para esto vamos al archivo employees.routes.js
y buscamos la ruta DELETE
y la modificamos de la siguiente manera:
router.delete('/employees/:id', deleteEmployees)
Guardamos y vamos a la extensión Thunder client en este caso vamos a realizar una petición de DELETE
. Aquí vamos a colocar la ruta api/employees/id
que queremos eliminar, enviamos y vamos a ver el mensaje que dice 'empleado eliminado'
.
Validando la eliminación de datos
En la consola nos va a mostrar un objeto que dentro de este objeto va a contener unas propiedades que se llaman insertId
y affectedRows
.
{
fieldCount: 0,
affectedRows: 1,
insertId: 0,
serverStatus: 2,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0
}
Una vez realizada la eliminación de un elemento en la base de datos, es importante comprobar que realmente se eliminó una fila es con affectedRows
, a partir de acá yo puedo decir que si las filas afectadas fueron 1 entonces significa que sí ha eliminado algo.
Pero que pasaría, por ejemplo, si le paso un id
que no existe, de todas formas me va a enviar una respuesta, como que sí fue eliminado, pero en realidad no fue así. Y si entro al objeto busco en affectedRows
me va a decir que es cero, por lo tanto, voy a saber que no eliminó ninguna fila.
Entonces, para poder dar mayor información al cliente, podemos hacer lo mismo que antes, es decir, utilizar una condición para validar si realmente se ha eliminado una fila o no.
if(result.affectedRows <= 0) return res.status(404).json({
message: 'Empleado no encontrado'
})
En este caso vamos a utilizar la constante result
, que cuando responda me va a dar un objeto, que tiene una propiedad llamada affectedRows
.
En este caso lo que estamos probando es si no afectó ninguna fila, es decir si es menor o igual a cero, en ese caso, que no haya afectado ninguna fila significa que no eliminó a ningún elemento y deberíamos enviar el mensaje 'empleado no encontrado'
.
Al contrario, si eliminamos algo, no devolverá un texto que diga empleado eliminado, no es necesario un mensaje. El cliente sabrá que la consulta fue realizada correctamente y eso es suficiente. En lugar de enviar un mensaje como estaba antes, voy a enviar un estatus 204
res.sendStatus(204)
El código 204 significa que todo ha ido bien y en este punto vamos a guardar.