TypeError: Cannot read property 'then' of undefined using promises

TypeError: Cannot read property 'then' of undefined using promises

我正在将这个网站作为一个项目,它是 AirBnB 的“沃尔玛”版本。

下面是按钮应该为上下文做的事情:

用户将单击列表中的“进行预订”按钮。 他们将 select 开始和结束日期然后提交。这将向服务器发送一个 HTTP 请求。

但是,我 运行 陷入了一个错误 returns :

TypeError: 无法读取未定义的 属性 'then' 在 /vagrant/LightBnB/LightBnB_WEB_APP/server/apiRoutes.js:44:7 <--

44:7行是下面的API路线:

这是导致错误的原因:

.then((reservation) => {
            res.send(reservation);

这是导致问题的 API ROUTE 逻辑:

  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);
      });
  });

该路由正在调用如下函数 addReservation():

    /**
 * 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 (, , , )
  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;

如果您需要更多信息,请告诉我。

TypeError: Cannot read property 'then' of undefined

addReservation() 没有 return 值,因此它 return 是 undefined。因此,当您尝试执行 addReservation(...).then(...) 时,您最终会尝试访问 undefined 上的 .then(),这会导致出现错误。

addReservation()里面,你需要改变:

pool.query(...).then(...).catch(...)

return pool.query(...).then(...).catch(...)

那 return 是你的承诺,这样调用者就可以在 returned 承诺上使用 .then()


请注意,addReservation() 中的 .catch() 处理程序正在记录错误,然后“吃掉”错误。您可能应该重新抛出错误,以便调用者可以看到错误:

改变这个:

.catch((e) => console.log(e.message));

对此:

.catch((e) => {
     console.log(e.message)
     // re-throw the error so it propagates to the caller
     throw e;
});

此外,请注意 res.send(e) 可能不会提供太多有用的信息,因为 Error 对象的大多数属性不可枚举,因此当 res.send() 将 Error 对象转换为JSON.