Добавление операций 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.
Мои ранее написанные статьи,