114 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			114 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								tags:
							 | 
						||
| 
								 | 
							
								  - node-js
							 | 
						||
| 
								 | 
							
								  - REST
							 | 
						||
| 
								 | 
							
								  - APIs
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Creating a RESTful API: Introduction
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								We are going to use Express to create a
							 | 
						||
| 
								 | 
							
								[RESTful API](RESTful_APIs.md) in Node.js.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Request types
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Express provides us with methods corresponding to each of the
							 | 
						||
| 
								 | 
							
								[HTTP request types](HTTP_request_types.md):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `.get()`
							 | 
						||
| 
								 | 
							
								- `.post()`
							 | 
						||
| 
								 | 
							
								- `.put()`
							 | 
						||
| 
								 | 
							
								- `.delete()`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Our data set
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Typically when you create a RESTful API you are going to be returning data
							 | 
						||
| 
								 | 
							
								> from a database. For simplicity we are just going simulate this with a simple
							 | 
						||
| 
								 | 
							
								> data array so that we can focus on the Express syntax rather than database
							 | 
						||
| 
								 | 
							
								> handling. Later we will integrate this with a
							 | 
						||
| 
								 | 
							
								> [MongoDB database](05_%20Integrating_the_database.md).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								We will mainly work with the following array of objects:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								const courses = [
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    id: 1,
							 | 
						||
| 
								 | 
							
								    name: "First course",
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    id: 2,
							 | 
						||
| 
								 | 
							
								    name: "Second course",
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    id: 3,
							 | 
						||
| 
								 | 
							
								    name: "Third course",
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								];
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Creating an Express instance
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								We first create an instance of Express within `index.js`. This will be the main
							 | 
						||
| 
								 | 
							
								coordinating file and we will aim to minimise the amount of business logic we
							 | 
						||
| 
								 | 
							
								have in this file. It should really just be for initialization and managing
							 | 
						||
| 
								 | 
							
								[middleware](Middleware_in_NodeJS.md).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								const express = require("express");
							 | 
						||
| 
								 | 
							
								const app = express();
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Routing
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								We are going to receive all our HTTP requests at the path `/api/courses` and we
							 | 
						||
| 
								 | 
							
								will place all code related to this route in a dedicated Node module
							 | 
						||
| 
								 | 
							
								(`routes/courses.js`) rather than within `index.js` which should remain as
							 | 
						||
| 
								 | 
							
								uncluttered as possible.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								First we need to declare this in `index.js`:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								const courses = require("./routes/courses");
							 | 
						||
| 
								 | 
							
								app.use("/api/courses", courses);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Then within `courses.js` we instantiate an express router that `app.js` will
							 | 
						||
| 
								 | 
							
								route to:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								const router = express.Router();
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Our REST requests will all follow the following pattern:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								router.get("/", (req, res) => {
							 | 
						||
| 
								 | 
							
								  res.send(courses);
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								We target the `Router` instance we created and all paths will be expressed as
							 | 
						||
| 
								 | 
							
								`/` since the app will route by default to `/courses/api` from `index.js`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Create listener
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								With the routing established and the Express instance created we can now listen
							 | 
						||
| 
								 | 
							
								for requests:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								app.listen(3000, () => console.log("Listening on port 30000..."));
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## REST endpoints
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								We can now proceed to set up our RESTful endpoints:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[GET requests](1_GET.md)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[POST requests](2_POST.md)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[PUT requests](3_PUT.md)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[DELETE requests](4_DELETE.md)
							 |