New and Create Routes




Lesson Objectives

  1. Create a new route and page
  2. Add interactivity to your site with forms
  3. Create a post route
  4. Define middleware
  5. View body of a post request
  6. Redirect the user to another page



Create a new route and page

  1. Let's create a page that will allow us to create a new fruit

  2. First, we'll need a route for displaying the page in our server.js file IMPORTANT: put this above your show route, so that the show route doesn't accidentally pick up a /fruits/new request

    //put this above your show.ejs file
    app.get("/fruits/new", (req, res) => {
      res.render("new.ejs")
    })
  3. Now lets's create the html for this page in our /views/new.ejs file

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <title>Create a new Fruit</title>
      </head>
      <body>
        <h1>New Fruit page</h1>
      </body>
    </html>



  1. Visit http://localhost:3000/fruits/new to see if it works



Add interactivity to your site with forms

We can use forms to allow the user to enter their own data:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Create a new Fruit</title>
  </head>
  <body>
    <h1>New Fruit page</h1>
    <!--  NOTE: action will be the route, method will be the HTTP verb-->
    <form action="/fruits" method="POST">
      Name: <input type="text" name="name" /><br />
      Color: <input type="text" name="color" /><br />
      Is Ready To Eat: <input type="checkbox" name="readyToEat" /><br />
      <input type="submit" value="Create Fruit" />
    </form>
  </body>
</html>

NOTE: the form element has an action and a method attribute. We get these values from our RESTful routes table. We'll need this info for the next step too.




Create a post route

Since the form in the last step tells the browser to create a POST request to /fruits, we'll need to set up a route handler for this kind of request

app.post("/fruits", (req, res) => {
  res.send("hi")
})



Define middleware

We can have a function execute for all routes:

app.use((req, res, next) => {
  console.log("I run for all routes")
  next()
})
  • This is called 'middleware'
  • It runs in the middle of the request response cycle (in the middle)
    • sometime after the request is received, but before the final route handler is called
  • Be sure to put middleware at the top of your server.js file, so that other routes don't handle the request and send the response before the middleware can be executed
  • Most of the time, you won't write your own middleware, but a lot of plugins and extended functionality of express exist as middleware



View body of a post request

  1. The POST request to our sever has data in it (name, color, readyToEat, etc).

  2. We can easily access this data with a middleware function

  3. Tell express to use the middleware

    //near the top, around other app.use() calls
    app.use(express.urlencoded({ extended: false }))



  1. Now, inside the POST to /fruits route handler, we can do the following:

    app.post("/fruits", (req, res) => {
      console.log(req.body)
      res.send("data received")
    })
  2. Push this data into our fruits array:

app.post("/fruits", (req, res) => {
  if (req.body.readyToEat === "on") {
    //if checked, req.body.readyToEat is set to 'on'
    req.body.readyToEat = true //do some data correction
  } else {
    //if not checked, req.body.readyToEat is undefined
    req.body.readyToEat = false //do some data correction
  }
  fruits.push(req.body)
  console.log(fruits)
  res.send("data received")
})



Redirect the user to another page

  • The data has been added to our fruits array
  • Let's send the user back to the fruits index page upon completion
app.post("/fruits", (req, res) => {
  if (req.body.readyToEat === "on") {
    //if checked, req.body.readyToEat is set to 'on'
    req.body.readyToEat = true
  } else {
    //if not checked, req.body.readyToEat is undefined
    req.body.readyToEat = false
  }
  fruits.push(req.body)
  res.redirect("/fruits") //send the user back to /fruits
})

Put a link in the index page going to the new page

<nav>
  <a href="/fruits/new">Create a New Fruit</a>
</nav>



Copyright © General Assembly 2022

Created by DanielJS