是否可以将渲染函数放在 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}`))
)

解释:

  1. model.findById(req.session.userLogin._id) - 做它之前做的事情
  2. 对...
  3. 返回的承诺数组使用Promise.all
  4. user.bookedRooms.map 其中,对于每个 eachRoom returns
  5. 返回的承诺
  6. roomModel.findById(eachRoom) ...到目前为止还好吗?
  7. 一旦所有承诺都解决了,结果就在 .then(rooms
  8. 中的 rooms
  9. res.render('registration/dashboard', ...等等,做你在代码中做的事

我使用 rooms 作为结果的名称,以简化

res.render('registration/dashboard', {
    rooms: roomsArr,
    ttl: title,
    sty: style
})

res.render('registration/dashboard', {
    rooms,
    ttl: title,
    sty: style
})