Estoy haciendo este sitio web como un proyecto que es una versión "Walmart" de AirBnB.
Esto es lo que se supone que debe hacer el botón para el contexto:
Un usuario hará clic en el botón "Hacer reserva" en una lista. Seleccionarán una fecha de inicio y finalización y luego la enviarán. Esto enviará una solicitud HTTP al servidor.
Sin embargo, me encuentro con un error donde devuelve:
TypeError: no se puede leer la propiedad 'entonces' de undefined en /vagrant/LightBnB/LightBnB_WEB_APP/server/apiRoutes.js:44:7 <--
La línea 44:7 es la ruta API a continuación:
Esto está causando el error:
.then((reservation) => { res.send(reservation);Esta es la lógica de RUTA API que está causando un problema:
router.post('/reservations', (req, res) => { const userId = req.session.userId; database .addReservation({ ...req.body, guest_id: userId }) .then((reservation) => { res.send(reservation); }) .catch((e) => { console.error(e); res.send(e); }); });Esa ruta está llamando a la función addReservation() que es la siguiente:
/** * Add a reservation to the database * @param {{}} reservation An object containing all of the reservation details. * @return {Promise<{}>} A promise to the reservation. */ const addReservation = function (reservation) { const queryString = ` INSERT INTO reservations( start_date, end_date, property_id, guest_id ) VALUES ($1, $2, $3, $4) RETURNING * `; const values = [ reservation.start_date, reservation.end_date, reservation.property_id, reservation.guest_id, ]; pool .query(queryString, values) .then((res) => { res.rows; }) .catch((e) => console.log(e.message)); }; exports.addReservation = addReservation;Por favor, hágamelo saber si necesita más información.
TypeError: no se puede leer la propiedad 'entonces' de indefinido
addReservation() no tiene valor de retorno, por lo que devuelve undefined . Entonces, cuando intentas hacer addReservation(...).then(...) , terminas intentando acceder a .then() en undefined , lo que da como resultado el error que obtienes.
Dentro de addReservation() , debe cambiar:
pool.query(...).then(...).catch(...)a
return pool.query(...).then(...).catch(...) Eso devuelve su promesa para que la persona que llama pueda usar .then() en la promesa devuelta.
Tenga en cuenta que su controlador .catch() en addReservation() está registrando y luego "comiendo" el error. Probablemente debería volver a generar el error para que la persona que llama pueda ver el error:
Cambia esto:
.catch((e) => console.log(e.message));a esto:
.catch((e) => { console.log(e.message) // re-throw the error so it propagates to the caller throw e; }); Además, tenga en cuenta que res.send(e) probablemente no proporcione mucha información útil porque la mayoría de las propiedades del objeto Error no son enumerables y, por lo tanto, no aparecerán cuando res.send() convierta el objeto Error en JSON.