#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>
Надеюсь, это сработает для вас.