To-Do list: #3 робимо просте Web API

Цей пост є продовженням.

Наше завдання створити просте api і тому зараз ми не будемо використовувати базу даних, натомість ми будемо зберігати дані в масив.

Щоб отримати доступ до даних, які прийшли в пост запит нам потрібно додати наступний код в app.js

app.use(express.json())
app.use(express.urlencoded())

Перший запис express.json() потрібний, якщо дані були надіслані у форматі JSON з використанням заголовка Content-Type: application/json

Друга строчка express.urlencoded() потрібна якщо дані були надіслані з використанням Content-Type: application/x-www-form-urlencoded

В обох випадках можете отримати доступ до даних, ось так req.body

Приклад отримання даних:

app.post('/', (req, res) => {
  const param = req.body.param
  const name= req.body.name
  ...
})

Напишемо api в стилі REST (Representational State Transfer – «передача репрезентативного стану»). REST-архітектура передбачає використання таких HTTP методів: GET, POST, PUT, DELET та інші. Але ми будемо використовувати лише ці чотири.

Тепер створимо папку з ім’ям routes у корені проекту. І до неї додамо файл todoRoutes.js

Тут буде код, що відповідає за відображення, додавання, зміну та видалення даних. Спочатку ми завантажуємо модуль express

'use strict'

const { Router } = require('express')
const router = Router()

Створимо масив для зберігання даних (імітуємо роботу з базою даних)

let todos = [
  {
    name: 'test',
    done: false
  }
]

Додаємо роут для відображення всіх записів з масиву

router.get('/', function(request, response, next) {
  response.json(todos)
})

Добавляем роут для отображения записи по id

router.get('/:id', function(request, response, next) {
  let id = request.params.id
  let todo = todos[id]

  if (!todo) {
    return next(new Error('Todo was not found'))
  }

  response.json(todo)
})

Тепер роут для додавання запису

router.post('/', function(request, response, next) {
  let todo = {
    name: request.body.name,
    done: false
  }

  todos.push(todo)

  response.json(todo)
})

Тепер роут для оновлення запису з id

router.put('/:id', function(request, response, next) {
  let id = request.params.id
  let todo = todos[id]

  if (!todo) {
    return next(new Error('Todo was not found'))
  }

  todo.name = request.body.name
  todo.done = request.body.done

  response.json(todo)
})

І видалення запису по id

router.delete('/:id', function(request, response, next) {
  let id = request.params.id

  if (!todos[id]) {
    return next(new Error('Todo was not found'))
  }

  todos.splice(id, 1)

  response.json('Successfully removed')
})

І насамкінець нам потрібно визначити їх в об’єкті module.exports. Об’єкт module.exports це те, що повертає функція require()

module.exports = router

Тепер у нас є код для роботи з нашим списком завдань. Але це ще не все, тепер нам потрібно активувати наш todoRoutes.js Для цього нам потрібно додати трохи код в app.js

// Require API routes
var todoRoutes = require('./routes/todoRoutes')

// Import API Routes
app.use('/api/todo', todoRoutes)

Ми просто імпортуємо наші маршрути та вказуємо базову точку входу. Тепер всі наші роути будуть доступні за адресою url http://127.0.0.1:3000/api/todo

Для тестування api можна використовувати postma чи insomnia.

Найсвіжіший код тут, цей репозиторій розвиватиметься. Щоб побачити зміни, які я зробив, потрібно дивитися сюди.