es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo atrapar errores usando Postgres, PG, Express?

const pool = require('../db')
const asyncHandler = require('express-async-handler')
const { generateToken } = require('../middleware/userAuth')

// @desc Registrar nuevo usuario
// @route POST /api/users/register
// @public Público
const registerUser = asyncHandler(async (req, res) => { 
  const { email, name, password } = req.body 
  const newUser = {
    name, 
    email,
    password
  }
  const existingUser = ''

  if (existingUser) {
    res.status(400)
    throw new Error('El usuario ya existe')
  } else {
    try {
      const result = await pool.query(
        'INSERT INTO users (name, email, password) VALUES ($1, $2, $3) RETURNING *',
        [name, email, password],
        (err, res) => {
          if (err) {
            console.error(err.toString()); // aquí se imprime el error de PostgreSQL en la consola
          }
        }
      )
      res.status(201)
      res.json(result.rows)
    } catch (error) {
      console.error(error.toString()); // aquí se imprime el error de Node/Express en la consola
      res.status(400)
      throw new Error('No se pudo crear el usuario')
    }
  }
})

Estoy tratando de averiguar cómo hacer console.log de los errores que provienen de los errores de la base de datos de PostgreSQL cuando hago una consulta.

Hasta ahora, el try/catch solo captura los errores principales en Express. La consola.log(error) dirá “Type Error, cannot return rows of undefined”, lo que significa que la variable “result” es indefinida porque la consulta falló, y “No se pudo crear el usuario” del nuevo error lanzado. (A propósito hice que fallara)

El callback “err” no parece console.log nada.

Me gustaría poder ver qué problema específico hubo en PostgreSQL, como en este caso las columnas no existen.

¿Alguna idea?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una solución es agregar manejo de errores a la propia consulta utilizando un bloque try/catch en lugar de una función de devolución de llamada. Esto te permitirá capturar errores específicos de la base de datos y registrarlos. Aquí tienes un ejemplo:

    try {
      const result = await pool.query(
        'INSERT INTO users (name, email, password) VALUES ($1, $2, $3) RETURNING *',
        [name, email, password]
      )
      res.status(201)
      res.json(result.rows)
    } catch (error) {
      console.log(error)
      res.status(400)
      throw new Error('No se puede crear el usuario')
    }
    

    En este ejemplo, hemos eliminado la función de devolución de llamada y envuelto toda la consulta en un bloque try/catch. Si la consulta falla, el error se capturará y se registrará en la consola.

    También puedes personalizar el mensaje de error basado en el código de error específico devuelto por Postgres. Por ejemplo, si las columnas no existen, el código de error será “42703”. Puedes agregar una condición dentro del bloque catch para verificar el código de error y mostrar un mensaje de error específico. Aquí tienes un ejemplo:

    } catch (error) {
      if (error.code === '42703') {
        console.log('Columna no encontrada')
        res.status(400)
        throw new Error('No se puede crear el usuario: Columna no encontrada')
      } else {
        console.log(error)
        res.status(400)
        throw new Error('No se puede crear el usuario')
      }
    }
    

    De esta manera, puedes proporcionar mensajes de error más detallados al usuario y facilitar la diagnóstico y solución de problemas con la base de datos.

Comments are closed.