【发布时间】:2019-12-06 04:42:54
【问题描述】:
所以我在通过 for 循环后渲染网页,但问题是当我将渲染放入 for 循环时,同一个页面会被多次渲染,这最终给了我错误:
Cannot set headers after they are sent to the client
^^ 这会使我的应用程序崩溃。
如果我将我的渲染放在 for 循环之外,我正在拉取的数据将无法拉取。
router.get('/dashboard', (req, res) =>
{
const roomArr = [];
model.findById(req.session.userLogin._id)
.then((user) =>
{
user.bookedRooms.forEach((eachRoom) =>
{
console.log(eachRoom);
roomModel.findById(eachRoom)
.then((roomInfo) =>
{
console.log(roomInfo);
console.log(`Rooms Array: ${roomArr}`);
roomArr.push(roomInfo);
})
.catch((err) =>
{
console.log(`Could not book rooms: ${err}`);
})
})
res.render('registration/dashboard', {
rooms: roomArr,
ttl: title,
sty: style
})
})
})
^^ 如我上面的代码所示,我的目标是在我的会话中提取bookedRooms(array) 的id,然后检查该id 是否与房间集合中的roomsID 匹配。如果这 2 个 id 匹配,则表示用户已预订房间。
我遇到的问题是我的房间没有被拉出,我认为这可能是因为我的 render 不在我的 .then 之后。
我想我的主要问题是我的 render 必须在我的 .then 之后吗??
【问题讨论】:
-
user 是我的数据库模型,bookedRooms 是我的 mongoDB 集合中的一个数组
-
每个请求只能调用一次
res.render(),因为它会发送响应,并且每个 http 请求只能发送一个响应。在我看来,您需要收集所有数据,然后仅当您拥有所有数据并拥有一个接受数据数组的模板时才调用res.render()。 -
这就是我上面所做的,我只是错过了推送部分。所以我收集了所有预订的房间,然后将它们推入 roomArr 数组,以便该数组包含所有预订的房间。然后在代码的最后我做一个渲染......
-
好吧,您无需等待所有收集完成后再致电
res.render(),因此您在收集任何房间之前致电res.render()。无论如何,很高兴 JaromandaX 向您展示了如何做到这一点。 -
你知道我如何用我的代码解决这个问题吗?因为如果我可以使用数组找出它,我可以检查房间是否在数组内,然后我可以阻止用户多次预订同一个房间
标签: javascript node.js express handlebars.js