Элементы цикла через массив объектов, комнат.forEach не является функцией в ejs

#node.js #ejs

#node.js #ejs

Вопрос:

Я пытаюсь выполнить цикл из массива объектов в шаблоне EJS welcome.ejs, но он выдает ошибку, я искал это в Google, но это не работает, любая помощь была бы оценена.

 TypeError: /var/www/html/ochat/views/welcome.ejs:3
    1| 
    2| <ul>    
 >> 3|     <% rooms.forEach(function(room){ %>
    4|     <li><%= room %></li>
    5|     <%  }); %>    
    6| </ul>

rooms.forEach is not a function
    at eval (/var/www/html/ochat/views/welcome.ejs:12:14)
    at welcome (/var/www/html/ochat/node_modules/ejs/lib/ejs.js:691:17)
    at tryHandleCache (/var/www/html/ochat/node_modules/ejs/lib/ejs.js:272:36)
    at View.exports.renderFile [as engine] (/var/www/html/ochat/node_modules/ejs/lib/ejs.js:489:10)
    at View.render (/var/www/html/ochat/node_modules/express/lib/view.js:135:8)
    at tryRender (/var/www/html/ochat/node_modules/express/lib/application.js:640:10)
    at Function.render (/var/www/html/ochat/node_modules/express/lib/application.js:592:3)
    at ServerResponse.render (/var/www/html/ochat/node_modules/express/lib/response.js:1012:7)
    at ServerResponse.res.render (/var/www/html/ochat/node_modules/express-ejs-layouts/lib/express-layouts.js:77:18)
    at route.get (/var/www/html/ochat/routes/routes.js:57:17)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  

Route.js

 route.get('/welcome',         
        async(req, res) => {
            let roomsMap = {};
            await Chatroom.find({}).select('roomName roomType userAllowed').then((rooms) => {                
                rooms.forEach(function (room) {                    
                        roomsMap[room._id] = room;
                });           
            }).catch(err => {
                res.status(400).json({ message: "Not able to get rooms" });         
            });  

            res.render('welcome', {
                name: displayName,
                email: email,
                img: img,
                googleId: googleId,
                userId: userId,
                rooms: roomsMap
        });
    });  
  

welcome.ejs

 <ul>    
    <% rooms.forEach(function(room){ %>
    <li><%= room %></li>
    <%  }); %>    
</ul>
  

Результирующий объект:

 {"5f4f3662cb74553d5e03d076":{"_id":"5f4f3662cb74553d5e03d076","roomName":"PHP","roomType":"public"},"5f4f3697cb74553d5e03d077":{"_id":"5f4f3697cb74553d5e03d077","roomName":"JS","roomType":"public"},"5f4f36c6cb74553d5e03d078":{"_id":"5f4f36c6cb74553d5e03d078","roomName":"none","roomType":"private"},"5f4f3c73d063fb4a2032daae":{"_id":"5f4f3c73d063fb4a2032daae","roomName":"OpenSource","roomType":"public"}}
  

Ответ №1:

Это потому, что вы выполняете итерацию по объекту. И forEach используется только для массивов. Вы можете выполнить цикл через этот объект как:

 <ul>    
    <% Object.values(rooms).map((room){ %>
    <li><%= room.roomName %></li>
    <%  })); %>    
</ul>
  

Надеюсь, это сработает для вас.