We will build a web app using Node.js and Express - a Pokedex app.
For this exercise, we will continue building our Pokedex web app - setting up our server to accept POST requests to save user-provided data. We will serve a form to the user for them to send data to our server to create a new pokemon.
The starter code in this repository builds upon the previous exercise's (pokedex-express).
- Fork and clone this repository to your computer
- Run
npm installto install dependencies - Look in the starter file called
index.js, runnodemonto start local server on port 3000 - Open
localhost:3000on your browser and see the home page - Install the react jsx express libraries described in the gitbook
The comments in this file are deliberately verbose meant to orientate you to an Express app for the first time. Feel free to remove any or all comments.
-
Expose a new endpoint that intercepts GET requests to
/pokemon/new, which responds with a HTML page with aformthat has these fields:id,num,name,img,height, andweight -
Point the form to submit data to the (
/pokemon) route using POST method -
(for the
idandnumfields, for now, the user will simply choose a number. Obviously if they happen to pick an id that already exists, they will have a bad time. We will have the tools to correct this soon) -
Expose a new endpoint that accepts POST requests to
/pokemon, which parses the form data and saves the new pokemon data intopokedex.json
RESTful routing is a scheme to structure your URLS that removes duplication, and looks clean. For each type of resource, you can specify a set of routes easily.
| URL | HTTP Verb | Action | Description |
|---|---|---|---|
| /photos/ | GET | index | Display a list of all photos |
| /photos/new | GET | new | Display a form for creating a photo |
| /photos | POST | create | Accept a request for creating a photo |
| /photos/:id | GET | show | Display a page for a single photo |
| /photos/:id/edit | GET | edit | Display a form for editing a specific photo |
| /photos/:id | PATCH/PUT | update | Accept a request for new data for a specific photo |
| /photos/:id | DELETE | destroy | Accept a request to delete a specific photo |
-
create
jsxfiles for every page your app displays -
validate the user's input data. If the user makes a mistake (i.e., the name of the pokemon is empty) render the form instead. Display the error that they made and how they can correct it.
-
Add a "Sort by name" button to the homepage (
/route) that when clicked, sends a GET request with a query parameter specifying "?sortby=name" ( this requests a whole new page )- (hint) this button should be a subit button in a form with method GET. You would need to add an input that creates the appropriate request.
-
Implement this sort functionality as a drop down (
selectinput) of all the sorting fields the user can choose to sort by. -
Add a "Sort by weight" button to the homepage (
/route) that when clicked, sends a GET request with a query parameter specifying "?sortby=weight" ( this requests a whole new page ) -
Add a "Sort by height" button to the homepage
- what do you need to write to abstract the idea of sorting in your code? What is the most elegant way to sort by any field in the pokedex?
-
restrict the user from creating a pokemon with a id, number and name that already exists
-
validate all of the incoming user data. Restrict values to reasonable numbers (i.e. height less that 100, etc.) What is the best structure for your app to have this validation code?
-
Instead of saving
idandnumas random values input by the user via the form, implement the logic that guarantees the uniqueness ofidandnumof every newly created pokemon- eg. if last pokemon in the
pokedex.jsonhas"id": 151and"num": "151", the new pokemon object could have"id": 152and"num": "152" - Hint: You might consider adding a new key value pair in
pokedex.json, like"lastKey": 151- in this system you will not have to worry about ids being consecutive integers. - are there any other ways to make a unique id for something? Remember that it is technically possible for 2 requests to be made to your server at almost the exact same time. What would happen when request 1 comes in and you begin to write to the disk and request 2 comes in and starts and finishes writing to the disk before request 1 finished writing to the disk?
- eg. if last pokemon in the