是否可以将渲染函数放在 express 的 for 循环中?
Is it possible to put a render function inside a for loop in express?
所以我在通过 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[= 之后30=].
我想我的主要问题是我的 render 必须紧接在 之后吗?then??
假设 user.bookedRooms
是一个常规 Javascript 数组
如下操作
router.get('/dashboard', (req, res) =>
model.findById(req.session.userLogin._id)
.then(user => Promise.all(user.bookedRooms.map(eachRoom => roomModel.findById(eachRoom))))
.then(rooms => res.render('registration/dashboard', {
rooms,
ttl: title,
sty: style
}))
.catch(err => console.log(`Could not book rooms: ${err}`))
)
解释:
model.findById(req.session.userLogin._id)
- 做它之前做的事情
- 对...
返回的承诺数组使用Promise.all
user.bookedRooms.map
其中,对于每个 eachRoom
returns 返回的承诺
roomModel.findById(eachRoom)
...到目前为止还好吗?
- 一旦所有承诺都解决了,结果就在
.then(rooms
中的 rooms
中
res.render('registration/dashboard',
...等等,做你在代码中做的事
我使用 rooms
作为结果的名称,以简化
res.render('registration/dashboard', {
rooms: roomsArr,
ttl: title,
sty: style
})
到
res.render('registration/dashboard', {
rooms,
ttl: title,
sty: style
})
所以我在通过 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[= 之后30=].
我想我的主要问题是我的 render 必须紧接在 之后吗?then??
假设 user.bookedRooms
是一个常规 Javascript 数组
如下操作
router.get('/dashboard', (req, res) =>
model.findById(req.session.userLogin._id)
.then(user => Promise.all(user.bookedRooms.map(eachRoom => roomModel.findById(eachRoom))))
.then(rooms => res.render('registration/dashboard', {
rooms,
ttl: title,
sty: style
}))
.catch(err => console.log(`Could not book rooms: ${err}`))
)
解释:
model.findById(req.session.userLogin._id)
- 做它之前做的事情- 对... 返回的承诺数组使用Promise.all
user.bookedRooms.map
其中,对于每个eachRoom
returns 返回的承诺
roomModel.findById(eachRoom)
...到目前为止还好吗?- 一旦所有承诺都解决了,结果就在
.then(rooms
中的 res.render('registration/dashboard',
...等等,做你在代码中做的事
rooms
中
我使用 rooms
作为结果的名称,以简化
res.render('registration/dashboard', {
rooms: roomsArr,
ttl: title,
sty: style
})
到
res.render('registration/dashboard', {
rooms,
ttl: title,
sty: style
})