Search code examples
javascriptnode.jsmongodbexpressurl-routing

node js routing not rendering


I was trying to implement a website where there is a driver and passenger(carpool). So when a driver gives his details and clicks submit he goes to a URL (select) where he can choose the passenger which he wants.

I have written the following snippet:-

app.post('/passenger',function(req,res){
        var user = new User({profile:{name:req.body.uname},
        type:"passenger",
        phone_no:req.body.contact,
        origin:{city:req.body.pick},
        destination:{city:req.body.drop}
      //  email:req.body.email,
    //    password:req.body.password
    })
        user.save();
        res.redirect('/');
    });     

app.post('/driver',function(req,res){
        var user = new User({profile:{name:req.body.uname},
        type:"driver",
        phone_no:req.body.contact,
        origin:{city:req.body.pick},
        destination:{city:req.body.drop}
      //  email:req.body.email,
    //    password:req.body.password
    })
            user.save();
            console.log("heyyyy")
            res.redirect('/select');

    });

app.get('/select',function(req,res){
    // User.find(function(err,type){
 //            res.render('select',{type:type});
 //        });
    if (req.user){
        console.log("U are inside")
    if(req.user.type="passenger")
    {
      res.render('select');
    }
    else{
        res.send("You ar not admin");
    }
}
   console.log("u are outside")
   console.log(req.body.uname)
   console.log()     
 });

The values are getting saved in the database but I am not able to retrieve the information (i.e. the list of all the passengers).

I am not able to process it (i.e. giving error).

Please help me out..


Solution

  • It is hard to pinpoint the source of the problem without knowing how you are configuring your express server anyway I have created an example based on your context.

    app.js file:

    var express = require('express');
    var app = express();
    var bodyParser = require('body-parser');
    var engine = require('ejs-locals');
    var querystring = require('querystring');
    
    var drivers = [];
    
    var passengers = [{name: 'Wilson'}, {name: 'Raul'}];
    
    app.engine('ejs', engine);
    app.set('view engine', 'ejs');
    
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({extended: true}));
    
    app.get('/', function(req, res) {
      res.render('driver');
    });
    
    app.post('/driver', function(req, res) {
      var driver = {
        name: req.body.name,
        age: req.body.age
      };
    
      drivers.push(driver);
    
      var data = {
        driver: driver,
        passengers: passengers
      };
    
      res.render('passengers', data);
    });
    
    app.get('/result', function(req, res) {
      var data = {
        driverName: '',
        passengerNames: []
      };
    
      data.driverName = req.query.driverName;
      data.passengerNames = data.passengerNames.concat(req.query.passengerNames);
    
      res.render('result', data);
    });
    
    app.post('/api/passengers', function(req, res) {
      var data = {
        passengerNames: req.body.passengerNames,
        driverName: req.body.driverName
      };
    
      var qs = querystring.stringify(data);
      res.redirect('/result?' + qs);
    });
    
    app.listen(4040, function() {
      console.log('server up and running at port 4040');
    });
    

    views/layout.ejs file:

    <!doctype html>
    <html>
      <head>
        <title>Drivers App</title>
      </head>
      <body>
        <div id="app">
           <%- body %>
        </div>
        <script>
            document.addEventListener('DOMContentLoaded', function(e) {
    
            var btnNext = document.getElementById('btnNext');
            btnNext.onclick = function(e) {                   
                var allPassengers = document.querySelectorAll('input[type=checkbox]');
                var selectedPassengers = [].filter.call(allPassengers, function(p) {
                  return p.checked;
                });
    
                var passengerNames = [].map.call(selectedPassengers, function(p) {
                  return p.value;
                });
    
                var driverName = document.getElementById('driverName').innerHTML;
    
                var r = new XMLHttpRequest();
                r.open('POST', '/api/passengers');
                r.setRequestHeader('Content-type', 'application/json;charset=UTF-8');
                r.onreadystatechange = function() {
                  if (r.readyState != 4 || r.status != 200) return;
                  document.getElementById('app').innerHTML = r.responseText;
                };
    
                r.send(JSON.stringify({
                  passengerNames: passengerNames,
                  driverName: driverName
                }));
            };
    
          });
        </script>
      </body>
    </html>
    

    views/driver.ejs file:

    <% layout('layout.ejs') -%>
    
    <h1> Driver </h1>
    
    <form method="POST" action="/driver">
      <label>Name:</label>
      <input id="name" name="name" type="text"/>
      <br />
    
      <label>Age:</label>
      <input id="age" name="age" type="text"/>
      <br />
      <br />
    
      <input type="submit" value="Submit" />
    </form>
    
    `views/passengers.ejs`
    
    <% layout('layout') -%>
    
    <h1> Driver </h1>
    <p>Name: <span id="driverName"><%= driver.name%></span></p>
    
    <h1> Passengers </h1>
    <% passengers.forEach(function(p) {%>
       <input type="checkbox" value=<%= p.name %> /> <%= p.name %> <br />
    <% }); %>
    
    <br />
    <button id="btnNext">Next</button>
    

    views/result.ejs file:

    <h1>Success!</h1>
    
    <h2>Driver</h2>
    <h3><%= driverName %></h3>
    <br />
    <h2>Selected Passengers</h2>
    <% passengerNames.forEach(function(name) { %>
      <h3><%= name%></h3>
    <% }); %>