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.
我正在将这个网站作为一个项目,它是 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.