You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
3.6 KiB
169 lines
3.6 KiB
# Create an API
|
|
|
|
## Lesson Objectives
|
|
|
|
1. Define API
|
|
1. Initialize Directory
|
|
1. Set Up Express Server
|
|
1. Create Todo Controller
|
|
1. Initialize Mongoose
|
|
1. Create Todo Model
|
|
1. Create Create Route
|
|
1. Create Index Route
|
|
1. Create Delete Route
|
|
1. Create Update Route
|
|
|
|
## Define API
|
|
|
|
- An API stands for Application Program Interface
|
|
- It is a set of routines, protocols, and tools for building software applications
|
|
- It specifies how software components should interact
|
|
- Essentially it's documentation, but in the industry, it's come to mean a program or some existing software that you use to build your own app
|
|
|
|
## Initialize Directory
|
|
|
|
1. `npm init`
|
|
1. set entry point as server.js
|
|
1. `touch server.js`
|
|
1. `npm install express`
|
|
|
|
## Set Up Express Server
|
|
|
|
server.js:
|
|
|
|
```javascript
|
|
const express = require('express');
|
|
const app = express();
|
|
|
|
app.listen(3000, ()=>{
|
|
console.log('listening...');
|
|
});
|
|
```
|
|
|
|
## Create Todo Controller
|
|
|
|
1. `mkdir controllers`
|
|
1. `touch controllers/todos.js`
|
|
|
|
controllers/todos.js:
|
|
|
|
```javascript
|
|
const express = require('express');
|
|
const router = express.Router();
|
|
|
|
router.get('/', (req, res)=>{
|
|
res.send('index');
|
|
});
|
|
|
|
module.exports = router;
|
|
```
|
|
|
|
server.js:
|
|
|
|
```javascript
|
|
const todosController = require('./controllers/todos.js');
|
|
app.use('/todos', todosController);
|
|
```
|
|
|
|
## Initialize Mongoose
|
|
|
|
1. `npm install mongoose`
|
|
|
|
server.js:
|
|
|
|
```javascript
|
|
const mongoose = require('mongoose');
|
|
//...farther down the page
|
|
mongoose.connect('mongodb://localhost:27017/meancrud', { useNewUrlParser: true, useUnifiedTopology: true });
|
|
mongoose.connection.once('open', ()=>{
|
|
console.log('connected to mongod...');
|
|
});
|
|
```
|
|
|
|
Open terminal tabs for `mongod` and `mongo`
|
|
|
|
## Create Todo Model
|
|
|
|
1. `mkdir models`
|
|
1. `touch models/todos.js`
|
|
|
|
models/todos.js:
|
|
|
|
```javascript
|
|
const mongoose = require('mongoose');
|
|
|
|
const todoSchema = new mongoose.Schema({
|
|
description: String,
|
|
complete: Boolean
|
|
});
|
|
|
|
const Todos = mongoose.model('Todo', todoSchema);
|
|
|
|
module.exports = Todos;
|
|
```
|
|
|
|
## Create Create Route
|
|
|
|
1. We need to tell Express to expect JSON data in the body from AJAX, so we'll use `express.json()`
|
|
1. We'll also need to tell the client that the data coming back is JSON, not HTML, so we'll do `res.json()`
|
|
|
|
server.js:
|
|
|
|
```javascript
|
|
app.use(express.json()); //use .json(), not .urlencoded()
|
|
```
|
|
|
|
controllers/todos.js
|
|
|
|
```javascript
|
|
const Todos = require('../models/todos.js');
|
|
//...farther down the page
|
|
router.post('/', (req, res)=>{
|
|
Todos.create(req.body, (err, createdTodo)=>{
|
|
res.json(createdTodo); //.json() will send proper headers in response so client knows it's json coming back
|
|
});
|
|
});
|
|
```
|
|
|
|
test: `curl -X POST -H "Content-Type: application/json" -d '{"description":"weee","complete":true}' http://localhost:3000/todos`
|
|
|
|
## Create Index Route
|
|
|
|
controllers/todos.js:
|
|
|
|
```javascript
|
|
router.get('/', (req, res)=>{
|
|
Todos.find({}, (err, foundTodos)=>{
|
|
res.json(foundTodos);
|
|
});
|
|
});
|
|
```
|
|
|
|
test: `curl http://localhost:3000/todos`
|
|
|
|
## Create Delete Route
|
|
|
|
```javascript
|
|
router.delete('/:id', (req, res)=>{
|
|
Todos.findByIdAndRemove(req.params.id, (err, deletedTodo)=>{
|
|
res.json(deletedTodo);
|
|
});
|
|
});
|
|
```
|
|
|
|
test: `curl -X DELETE http://localhost:3000/todos/58f79d490708714536c02474`
|
|
|
|
## Create Update Route
|
|
|
|
controllers/todos.js:
|
|
|
|
```javascript
|
|
router.put('/:id', (req, res)=>{
|
|
Todos.findByIdAndUpdate(req.params.id, req.body, {new:true}, (err, updatedTodo)=>{
|
|
res.json(updatedTodo);
|
|
});
|
|
});
|
|
```
|
|
|
|
test: `curl -X PUT -H "Content-Type: application/json" -d '{"description":"I updated this","complete":true}' http://localhost:3000/todos/58f7a4fd26b1a345e9281cb8`
|