Obtengo datos de una API y los muestro en mi servidor local.
A continuación se muestra mi código para obtener datos que coincidan con el ID de los datos de la API:
router.get('/:id', async (req, res) => { checkString(req.params.id) try { const person = await peopleData.getPersonById(req.params.id); res.json(person); } catch (e) { res.status(404).json({ message: 'There is no person with that ID' }); }Si no hay ninguna coincidencia, quiero mostrar el mensaje como en el bloque catch, pero el código no va allí ya que no obtener una coincidencia técnicamente no es un error.
Así que probé el siguiente código para obtener este mensaje:
router.get('/:id', async (req, res) => { checkString(req.params.id) try { const person = await peopleData.getPersonById(req.params.id); if(!person) res.json('There is no person with that ID'); // Added new line here res.json(person); } catch (e) { res.status(404).json({ message: 'There is no person with that ID' }); }Esto funciona, pero imprime el mensaje con comillas alrededor como una cadena, ¿hay alguna manera de mostrar el mensaje en el bloque catch si no se encuentra ninguna coincidencia?
Puede arrojar un error y la captura lo mostrará.
if(!person) throw new Error("There is no person with that ID"); ....luego en la captura...
catch(e){ res.status(404).json({ message: e.message }) }Si está enviando personas a una página de "pila de errores" de pantalla completa, ¡es posible que no necesite usar res.json ()! También puedes usar res.send()
if(!person){ res.send('<p>There is no person with that ID</p>'; return; } // Or if(!person){ res.send('There is no person with that ID'; return; }Está devolviendo respuestas Json, por lo que parece que su consumidor no es una página web sino otra aplicación. Si es así, debe devolver undefined o null si no se encuentra ninguna persona, y dejar que la página web o el consumidor decidan qué mensaje mostrar. Las razones son:
"Usuario no encontrado" en muchas situaciones no es realmente un error, pero todo depende de su aplicación.
El bloque catch en su caso debe usarse para manejar otros errores, por ejemplo, su servidor de base de datos podría estar inactivo o la solicitud de la base de datos podría haber expirado, etc. Su código actual mostrará engañosamente "usuario no encontrado" si hay un error de base de datos!
También dejaría que el controlador de errores Express se encargue de tales errores reales, en lugar de codificar el manejo de errores para cada función API que tenga:
router.get('/:id', async (req, res, next) => { checkString(req.params.id); try { const person = await peopleData.getPersonById(req.params.id); res.json(person); // assuming getPersonById returns null if user not found } catch (e) { next(e); }); Su controlador de errores Express, donde aterriza la invocación de la next función anterior, debería ser algo como esto (suponiendo que el router es su aplicación Express):
router.use((err, req, res, next) => { let statusCode = err.status || 500; // Assuming your app need to return only json responses res.json(err); });