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.

Самый свежий код здесь, этот репозиторий развиваться. Чтобы увидеть изменения которые я сделал нужно смотреть сюда.