Добавление операций CRUD в API без зависимостей

В последней статье мы создали RESTful API, способный обрабатывать указанные конечные точки и реагировать на конечные точки, не определенные в API, без нарушения работы приложения. Всего этого мы добились без использования каких-либо NPM-пакетов.

В этой статье мы добавим функциональность CRUD в этот API, следуя правилу «без NPM-пакетов».

Создание RESTful API NodeJS без ExpressJS — структура файла

В этой статье мы добавим новый файл с именем crud.js, в котором будет храниться логика работы CURD.

Мы также добавим папку с именем data, в которой будут храниться все файлы, над которыми мы будем выполнять операции CRUD.

Создание RESTful API NodeJS без ExpressJS — операции CRUD

В crud.js мы сохраним все функции, связанные с CRUD, в этом файле.

const fs = require('fs')
const CRUD = {}
module.exports = CRUD

Мы будем выполнять операции CRUD с файлами JSON, поэтому мы импортируем fs для обработки файловых операций.

Объект CRUD будет содержать все функции, а затем экспортируется для использования в других файлах.

Создать файл

CRUD.create = async (name, object) => {
  let result
  const string = JSON.stringify(object)
  try {
    await fs.writeFileSync(`./data/${name}.json`, string)
    result = true
  } catch (error) {
    console.log(error)
    result = false
  }
  return result
}

Здесь у нас есть name и object в качестве параметров, name — это имя файла JSON, а object — содержимое внутри файла JSON. Этот метод создаст новый файл JSON с заданным именем и содержимым.

Прочитать файл

CRUD.readOne = async (name) => {
  let result
  try {
    const data = await fs.readFileSync(`./data/${name}.json`,      'utf-8')
    result = JSON.parse(data)
  } catch (error) {
    console.log(error)
    result = false
  }
  return result
}

Здесь у нас есть name в качестве параметра, который является именем файла JSON. Этот метод вернет содержимое файла JSON с заданным именем.

Обновить файл

CRUD.update = async(name, object) => {
  const string = JSON.stringify(object)
  let result
  try {
    await fs.writeFileSync(`./data/${name}.json`, string)
    result = true
  } catch (error) {
    console.log(error)
    result = false
  }
  return result
}

Здесь мы берем name и object параметры. Этот метод заменяет старый контент новым контентом, предоставленным в object, для данного name файла JSON.

Удалить файл

CRUD.delete = async (name) => {
  let result
  try {
    await fs.unlinkSync(`./data/${name}.json`)
    result = true
  } catch (error) {
    console.log(error)
    result = false
  }
  return result
}

Здесь мы удаляем файл JSON с заданным name.

Создание RESTful API NodeJS без ExpressJS — реализация CRUD в обработчиках

Теперь мы будем определять обработчики для каждого из методов маршрута /.

In handlers.js,

Сначала импортируйте файл crud.js.

const crud = require('./crud')

ПОЛУЧИТЬ метод

У нас был обработчик метода GET для маршрута /, который возвращал объект со строкой Hello World. Мы заменим его следующим.

handlers.fileReadOne = async (data,callback) => {
  const query = data['query']
  const file = await crud.readOne(query.id)
  if(!file) callback(400, {Error: 'File with id not found'})
  callback(200, {file})
}

Здесь мы читаем идентификатор из URL-запроса и возвращаем содержимое файла, если файл с именем идентификатора присутствует. В противном случае мы отправляем сообщение об ошибке «Файл с идентификатором не найден».

POST-метод

handlers.filePost = async (data, callback) => {
  const postData = JSON.parse(data['payload'])
  const isSuccess = await crud.create(postData.id, postData)
  if(!isSuccess) callback(404, {Error: 'Error While creating the file'})
  callback(201, {Success: 'File created Successfully!!'})
}

Здесь мы вызываем метод создания объекта crud, который создает файл JSON с именем id.json. Этот обработчик отправляет ответ о том, было ли создание файла успешным или нет.

УДАЛИТЬ метод

handlers.fileDelete = async (data,callback) => {
  const query = data['query']
  const isSuccess = await crud.delete(query.id)
  if(!isSuccess) callback(400, {Error: 'File with id not found'})
  callback(200, {Success: 'File Deleted!!'})
}

Здесь мы вызываем метод удаления объекта crud, который удаляет файл с заданным именем. Этот обработчик отправляет ответ о том, было ли удаление файла завершено или нет.

ПАТЧ-метод

handlers.fileUpdate = async (data, callback) => {
  const postData = JSON.parse(data['payload'])
  const isSuccess = await crud.create(postData.id, postData)
  if(!isSuccess) callback(404, {Error: 'Error While updating the file'})
  callback(201, {Success: 'File updated Successfully!!'})
}

Этот обработчик отправляет ответ о том, было ли обновление файла успешным или нет.

Создание NodeJS RESTful API без ExpressJS — подключение маршрутов с обработчиками

In router.js,

const handlers = require('./handlers')
const router = {
  '/' : {
    'GET': handlers.fileReadOne,
    'POST': handlers.filePost,
    'DELETE': handlers.fileDelete,
    'PATCH': handlers.fileUpdate
  },
  '/ping' : {
    'GET': handlers.ping
  },
  'notFound': handlers.notFound
}
module.exports = router

Здесь мы определяем, какой обработчик должен быть активен для какого метода в пути /.

Создание RESTful API NodeJS без ExpressJS — результаты CRUD

Для метода POST мы получаем следующий результат.

Что создает файл JSON следующим образом.

Для метода GET мы получаем следующий результат.

Здесь мы читаем файл JSON с именем 01.json и возвращаем его содержимое.

Для метода PATCH мы получаем следующий результат.

Это обновляет файл с именем 02.json содержимым, предоставленным в теле.

Для метода DELETE мы получаем следующий результат.

Это удалит файл 02.json, который мы создали в начале.

Итак, мы добавили CRUD-операции в наш RESTful API без ExressJS.

Но у нас есть проблема. Маршрут / без каких-либо запросов использовался для отправки строки Hello World, но теперь этого не происходит, потому что мы заменили предыдущий обработчик в методе GET на обработчик, который только принимает запросы и возвращает сообщение об ошибке в противном случае.

Но мы хотим и того, и другого, мы хотим, чтобы URL-адрес возвращал другое сообщение/информацию, независимо от того, включены запросы или нет. Мы также хотим добавить в API вложенную и динамическую маршрутизацию.

Поэтому в следующей статье мы обсудим реализацию вложенных и динамических маршрутов в наш API.

Мои ранее написанные статьи,