Access Object values when data as json object submit through form in EJS and Node

Viewed 176

I am trying to access the data in route file which is submitted through form in EJS view. With this room details I will forward to next route with Room id and Room name. The problem is return object is string and can not converted into JSON.

How can I access the Json object room and it's values like room._id, room.roomName

Welcome.ejs

        <form action="/chat" method="post">
            <div class="form-control">
                <label for="username">Display Name</label>
                <input type="text" name="username" id="username" placeholder="Enter username..." value="<%= name %>" required />
            </div>
            <div class="form-control">
                <label for="room">Room</label>
                <select name="room" id="room">                                                            
                    <% rooms.forEach(function(room){ %> 
                    <option value="<%= room %>" data-roomid="<%= room._id %>" data-roomtype="<%= room.roomType %>"><%= room.roomName %></option>
                    <%  }); %>                    
                </select>
            </div>
            <div class="form-control">                    
                <input type="hidden" name="email" value="<%= email %>" />
                <input type="hidden" name="img" value="<%= img %>" />
                <input type="hidden" name="googleId" value="<%= googleId %>" />
                <input type="hidden" name="userId" value="<%= userId %>" />
            </div>
            <button type="submit" class="btn">Join Chat</button>
        </form>        

Routes.js

route.get('/welcome',         
  async(req, res) => {
        let roomsMap = [];

        try{
            roomsMap = await Chatroom.find({}).select('roomName roomType userAllowed');                         
        }
        catch(err) {
            res.status(400).json({ message: "Not able to get rooms" });         
        };  
        //roomsMap is returning proprer json
        res.render('welcome', {
            name: req.session.displayName,
            email: req.session.email,
            user: req.session.userInfo,
            img: req.session.img,
            googleId: req.session.googleId,
            userId: req.session.userId,
            rooms: roomsMap
    });
});    

route.post("/chat",         
    (req, res) => {
        let postdata = req.body;
        let room = postdata.room;
        console.log('postdata room ',room);
        room = JSON.stringify(room);            
        console.log('room ', room);
        room = JSON.parse(room);
        console.log(typeof room);
        console.log('room obj ', room);  

        res.render('chatrooms', {
            displayName: postdata.username,
            room: postdata.room.roomName,
            roomid: room._id,
            email: postdata.email,
            img: postdata.img,
            googleId: postdata.googleId,
            userId: postdata.userId
       });
});

I have console the output, it would be easier to understand whats happening in background.

postdata room  { _id: 5f4f3662cb74553d5e03d076,
  roomName: 'PHP',
  roomType: 'public' }
room  "{ _id: 5f4f3662cb74553d5e03d076,\r\n  roomName: 'PHP',\r\n  roomType: 'public' }"
string
room obj  { _id: 5f4f3662cb74553d5e03d076,
  roomName: 'PHP',
  roomType: 'public' }
0 Answers
Related