Desde: 30-Mar-2023
Hasta 29-Ago-2023
Modo

Obtener elemento a partir de ID (8.ª parte)

Omar Giancarlo

Descripción Corta:

Obtén un elemento específico a partir de su ID con este tutorial de programación. Aprende cómo hacerlo fácilmente.

Anterior Siguiente

En esta sección vamos a realizar una consulta que devuelva un elemento en específico, es decir, vamos a obtener un elemento a partir del ID.  Para poder hacer esto vamos a ir a nuestro enrutador que es el archivo employees.routes.js y de momento no tengo ninguna ruta que me devuelva un solo empleado, sino que tengo una ruta que me devuelve todos. Para esto vamos a ir a nuestro archivo employees.routes.js y creamos una nueva ruta.

Esta nueva ruta se va a llamar /employees, y va a tener un parámetro algo especial que viene de Express.

Ese nuevo parámetro va a ser el id, este parámetro estará relacionado con Express y no con la base de datos. Entonces lo único que estamos diciendo aquí es que cuando visitemos la ruta employees/:id, antes de ejecutar la función de la ruta, primero le tenemos que pasar el parámetro id.

router.get( '/employees/:id', getEmployeeById )

De momento vamos a crear una nueva función llamada getEmployeeById, para esto vamos al archivo employees.controller.js y de la misma forma como tenemos la función getEmployees, vamos a crear nuestra nueva función getEmployeeById.

const getEmployeeById = async (req, res) => {
  try {
    res.send('obteniendo empleado por id')
  } catch (error) {
    console.error(error)
    res.status(500).send('Error al obtener la información')
  }
}

Esta función lo que va a ser es devolver un texto 'obteniendo empleado por id'

res.send('obteniendo empleado por id')

Ahora, para poder utilizar esta función tenemos que hacer, como el resto, exportarla junto con el resto de las rutas que ya tenemos exportando.

module.exports = {
    getEmployeeById,
    getEmployees,
    createEmployees,
    updateEmployees,
    deleteEmployees
}

Después tenemos que ir a nuestro archivo employees.routes.js e importar este nuevo objeto utilizando la sintaxis require()

const { getEmployeeById, getEmployees, createEmployees, updateEmployees, deleteEmployees } = require("../controllers/employees.controllers.js")

Ahora vamos a comprobar que todo esté funcionando con normalidad, para esto vamos a guardar y vemos que en la consola no tenemos ningún error.

Comprobación del mensaje que viene de Express

Seguido vamos al navegador y escribimos la ruta, api/employees/1 lo que estamos haciendo es que de todos los empleados me devuelva tan solo el empleado con el id 1.

En la pantalla vamos a ver el mensaje que habíamos escrito que decía 'obteniendo empleado por id'.

Si colocó api/employees/2 igualmente me sigue mostrando el mensaje y si a modo de prueba coloco cualquier cosa, es decir, cualquier cadena de todos modos me va a seguir mostrando el mensaje. 

Pero qué pasa si yo quito el parámetro después del api/employees/ me va a mostrar todos los empleados como lo habíamos visto anteriormente.

Esto significa que para que podamos ejecutar la función, para obtener un elemento en específico a partir de ID, tengo que ponerle el parámetro /:id a la ruta.

Este parámetro extra es justamente lo que el servidor puede extraer, por ejemplo pongo api/employees/14 me va a seguir mostrando el mensaje 'obteniendo empleados por id' aunque no exista dicho id.

Entendiendo el parámetro id en la ruta

En el archivo employees.controller.js, podemos extraer el parámetro de ID a partir de (req) que viene en la URL. Al hacer esto, podemos obtener un solo elemento mediante una consulta de SQL utilizando el ID extraído. “Obtener elemento a partir de ID” es una funcionalidad clave en nuestra API de empleados.

console.lof(req.params)

Este req.params guarda en un objeto todos los parámetros que vienen en la URL, por ejemplo si yo voy al navegador y coloco api/employees/12 me sigue mostrando el mensaje 'obteniendo empleados por id' y si voy a la consola me va a mostrar un objeto:

{ 
id: '6' 
}

Entonces de esta forma podemos extraer el valor id, también podríamos obtener el id solamente:

console.log(req.params.id)

Esto es lo mismo que antes, nada más que ahora solamente vamos a ver el valor de ese id que es 6.

Entonces en otras palabras este req.params.id es esa parte de la URL, que si le coloco cualquier cadena, como por ejemplo 'Hola mundo' eso es lo que voy a obtener como valor en la consola.

En una consulta de SQL, vamos a obtener un elemento a partir de ID de la siguiente manera.

Utilizando params en una consulta SQL

SELECT * FROM employee WHERE id = 1

Esta consulta me devuelve la fila correspondiente al id 1, pero si yo busco un valor que no existe, me va a devolver un resultado vacío. Esta misma consulta también la podemos realizar desde la función, para esto vamos a ir al archivo employees.controller.js y en la función getEmployeeById colocamos lo siguiente:

const rows = await query('SELECT * FROM employee WHERE id = ?', [req.params.id])

Esta consulta para entenderla mejor, selecciona desde la tabla, employee todos los empleados donde el id sea igual al parámetro que le estoy pasando a través de req.params.id, esto me va a dar una respuesta que la voy a almacenar en una constante llamada rows.

Esta variable rows va a guardar un arreglo de todos los datos que coinciden con esa consulta.

Ahora lo que vamos a hacer de momento es mostrar por consola lo que tiene rows, para esto voy al navegador y le coloco api/employees/1, la respuesta que voy a obtener es la consola es la siguiente:

[ RowDataPacket { id: 1, name: 'JOE', salary: 1000 } ]

Ahora podemos ver que me devuelve un arreglo que corresponde al empleado con id 1.

Si, por ejemplo, hacemos una consulta a un empleado que no existe, es decir, a un id que no existe en la base de datos, me va a devolver un arreglo vacío: [ ]

A partir de ahora estamos extrayendo los datos con el valor que está como parámetro en la URL.

Esa respuesta yo la podría enviar, pero antes, voy a extraer de este arreglo tan solo el primer valor o, el primer elemento del arreglo. 

Es decir, el índice cero [0] para tan solo enviar ese dato, de esta forma ya no va a enviar el texto que dice 'obteniendo empleados por id', sino que va a enviar un objeto JSON.

res.json(rows[0])

Consultando falsos id

En el proceso de obtener elementos a partir de ID, es importante manejar las respuestas del servidor de manera adecuada. Si un ID no existe en la base de datos, recibiríamos un arreglo vacío, lo cual puede confundir al usuario. Para evitar esto, podemos utilizar la respuesta del servidor para mostrar un mensaje de error 404 que indique que el elemento solicitado no existe. Así, el cliente tendrá una mejor experiencia de usuario y sabrá que la consulta realizada a través de la URL no fue exitosa.

Por ejemplo, si no encontró la ruta o hubo un error, va a dar un error 404 diciendo que la ruta solicitada no existe. Entonces podríamos utilizar este mismo mensaje para avisarle al usuario que el id ingresado no existe.

Porque si solamente coloco un ID que no existe no me va a mandar ningún mensaje de error, ya que la ruta que le estoy enviando es una ruta válida, por lo tanto, me va a decir que el status es 200 OK, y esto puede confundir al usuario, en cambio, sería diferente si utilizamos ese mensaje 404 para avisarle que el id solicitado no existe. Para esto tendríamos que realizarlo de la siguiente manera:

    if(rows.length <= 0) return res.status(404).json({
      message: 'Empleado no encontrado'
    })

En esta condición, estamos diciendo que si rows es un arreglo que está vacío, entonces significa que no encontró nada. 

Para esto utilizamos la propiedad length, que devuelve cuántos elementos tiene, entonces si el valor es menor o igual a cero significa que no encontraste nada. Vamos a retornar a través de res.status, un mensaje JSON que diga 'empleado no encontrado'

Esto sirve para que el cliente se entere de que no estuvo bien la consulta realizada a través de la URL.

Ir a la parte 9

Anterior Siguiente