Автор оригинала: FreeCodeCamp Community Member.
Предположительно, веб-разработчик не является незнакомцем для Отдых API и проблемы, которые архитектуруют эффективную и эффективную API Решение приносит.
Эти проблемы включают в себя:
- Скорость (время отклика API)
- Документация (четкие лаконичные документы, описывающие API)
- Архитектура и устойчивость (поддерживаемые и расширяемая кодовая база)
В этом руководстве мы собираемся решить все вышеперечисленное, используя комбинацию Node.js , Монгодб , Застегивайте и Чугерс Отказ
Исходный код для проекта доступен на Github Отказ
Прежде чем мы начнем …
У вас должен быть какой-то новичок/промежуточный Знание JavaScript , слышали о Node.js и Монгодб, И знать, что Отдых API находятся.
Ниже приведены некоторые ссылки, чтобы получить обновление:
Технология, которую мы будем использовать:
Это хорошая идея, чтобы открыть вышеуказанные страницы на новых вкладках, для удобной ссылки.
Вам нужно будет иметь следующее:
Вам также понадобится IDE и а Терминал, Я использую ITERM2 для Mac и Гипер для окон.
Давайте начнем!
Инициализируйте новый проект, открыв свой Терминал, выполняя каждую из следующих строк кода:
mkdir fastify-api cd fastify-api mkdir src cd src touch index.js npm init
В приведенном выше Кодексе мы создали два новых каталога, навигации к ним, создали index.js
Файл и инициализировал наш проект через NPM Отказ
Вам будет предложено ввести несколько значений при инициализации нового проекта, они вы можете оставить пустым и обновлять на более позднем этапе.
После завершения, а Package.json Файл генерируется в SRC
каталог. В этом файле вы можете изменить значения, введенные при назначении проекта.
Далее мы устанавливаем все зависимости Что нам понадобится:
npm i nodemon mongoose fastify fastify-swagger boom
Ниже приведено краткое описание того, что делает каждый пакет, цитируемый со своими соответствующими веб-сайтами:
узел
Настроить Номемон Нам нужно добавить следующую строку кода для нашего Package.json
Файл, в скриптах объект:
"start": "./node_modules/nodemon/bin/nodemon.js ./src/index.js",
Наше Package.json
Теперь файл должен выглядеть следующим образом:
{ "name": "fastify-api", "version": "1.0.0", "description": "A blazing fast REST APIs with Node.js, MongoDB, Fastify and Swagger.", "main": "index.js", "scripts": { "start": "./node_modules/nodemon/bin/nodemon.js ./src/index.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Siegfried Grimbeek(www.siegfriedgrimbeek.co.za)", "license": "ISC", "dependencies": { "boom": "^7.2.2", "fastify": "^1.13.0", "fastify-swagger": "^0.15.3", "mongoose": "^5.3.14", "nodemon": "^1.18.7" } }
мангуста
застеживать
Застеживать
бум
Настройте сервер и создайте первый маршрут!
Добавьте следующий код в свой index.js
файл:
// Require the framework and instantiate it const fastify = require('fastify')({ logger: true }) // Declare a route fastify.get('/', async (request, reply) => { return { hello: 'world' } }) // Run the server! const start = async () => { try { await fastify.listen(3000) fastify.log.info(`server listening on ${fastify.server.address().port}`) } catch (err) { fastify.log.error(err) process.exit(1) } } start()
Нам требуется Застегивайте Рамки, объявляйте наш первый маршрут и инициализируйте сервер на Порт 3000
Код довольно объяснивает, но принять к сведению объект параметров, переданный при инициализации Застегивайте :
// Require the fastify framework and instantiate it const fastify = require('fastify')({ logger: true })
Приведенный выше код позволяет Застегивание Встроенный в логике, который по умолчанию отключен.
Теперь вы можете запустить следующий код в вашем SRC
каталог в вашем Терминал :
npm start
Теперь, когда вы перейдите к http://localhost: 3000/ Вы должны увидеть {Здравствуйте: World}
Объект возвращен.
Мы вернемся к index.js
Файл, но сейчас давайте перейдем к настройке нашей базы данных.
Начните Mongodb и создайте модель!
Однажды Монгодб Был успешно установлен, вы можете открыть новое окно терминала и запускать Монгодб Экземпляр, выполняющий следующее:
mongod
С Монгодб Нам не нужно создавать базу данных. Мы можем просто указать имя в настройке и, как только мы храним данные, Монгодб создадим эту базу данных для нас.
Добавьте следующее в свой index.js
файл:
... // Require external modules const mongoose = require('mongoose') // Connect to DB mongoose.connect('mongodb://localhost/mycargarage') .then(() => console.log('MongoDB connected…')) .catch(err => console.log(err)) ...
В приведенном выше коде нам требуется Мангуст и подключиться к нашему Монгодб база данных. База данных называется Mycargarage
И если все прошло хорошо, вы теперь посмотрите Монгодб подключен ...
в вашем терминале.
Обратите внимание, что вам не нужно было перезапустить приложение, благодаря Узел Пакет, который мы добавили ранее.
Теперь, когда наша база данных работает и работает, мы можем создать нашу первую модель. Создайте новую папку в SRC
каталог называется модели
, и внутри него создать новый файл под названием Car.js
и добавьте следующий код:
// External Dependancies const mongoose = require('mongoose') const carSchema = new mongoose.Schema({ title: String, brand: String, price: String, age: Number, services: { type: Map, of: String } }) module.exports = mongoose.model('Car', carSchema)
Приведенный выше код объявляет наши carschema
Это содержит всю информацию, связанную с нашими автомобилями. Помимо двух очевидных типов данных: Строка
и Номер
Отказ Мы также используем Карта
который относительно новичок в Мангуст И вы можете прочитать больше об этом здесь Отказ Затем мы экспортируем наши carschema
Для использования в нашем приложении.
Мы могли бы продолжить настройку наших маршрутов, контроллеров и конфиг в index.js
Файл, но часть этого руководства демонстрирует устойчивую кодовую базу. Поэтому каждый компонент будет иметь свою собственную папку.
Создать автомобильный контроллер
Чтобы начать с создания контроллеров, мы создаем папку в SRC
каталог называется Контроллеры
и в папке мы создаем carcontroller.js
файл:
// External Dependancies const boom = require('boom') // Get Data Models const Car = require('../models/Car') // Get all cars exports.getCars = async (req, reply) => { try { const cars = await Car.find() return cars } catch (err) { throw boom.boomify(err) } } // Get single car by ID exports.getSingleCar = async (req, reply) => { try { const id = req.params.id const car = await Car.findById(id) return car } catch (err) { throw boom.boomify(err) } } // Add a new car exports.addCar = async (req, reply) => { try { const car = new Car(req.body) return car.save() } catch (err) { throw boom.boomify(err) } } // Update an existing car exports.updateCar = async (req, reply) => { try { const id = req.params.id const car = req.body const { ...updateData } = car const update = await Car.findByIdAndUpdate(id, updateData, { new: true }) return update } catch (err) { throw boom.boomify(err) } } // Delete a car exports.deleteCar = async (req, reply) => { try { const id = req.params.id const car = await Car.findByIdAndRemove(id) return car } catch (err) { throw boom.boomify(err) } }
Вышесказанное может показаться немного много, но на самом деле это действительно просто.
- Мы требуем бум Чтобы обработать наши ошибки:
boom.boomify (Err)
Отказ - Мы экспортируем каждый из наших функций, которые мы будем использовать на нашем маршруте.
- Каждая функция – это async Функция, которая может содержать ждать выражение, которое делает приостановку выполнения Async Function и ждет прошедшего разрешения обещания, а затем возобновляет Async Функция выполнение и возвращает разрешенное значение. Узнайте больше здесь.
- Каждая функция завернута в оператор TRY/CATH. Узнайте больше здесь.
- Каждая функция принимает два параметра:
req
(запрос) иОтветить
(ответ). В нашем уроке мы только используем только параметр запроса. Мы будем использовать его для доступа к корпусу запроса и параметрах запроса, позволяя нам обработать данные. Узнайте больше здесь. - Обратите внимание на код в строке 31:
Const Car ({... Req.body})
Это использует JavaScript Распространение оператора. Узнайте больше здесь. - Примите к сведению код в строке 42:
const {... Updatedata
Это использует JavaScript Разрушивание в сочетании с оператором распространения. Узнайте больше здесь.
Кроме того, мы используем некоторые стандартные Мангуст Функции, используемые для манипулирования нашей базой данных.
Вы, вероятно, сжигаете, чтобы уволить свой API и сделать чек здравомыслия, но прежде чем мы сделаем это, нам просто нужно подключить контроллер к маршруты а потом наконец подключить маршруты в приложение.
Создавать и импортировать маршруты
Еще раз мы можем начать с создания папки в корневом каталоге нашего проекта, но на этот раз он называется маршруты
Отказ В папке мы создаем index.js
Файл со следующим кодом:
// Import our Controllers const carController = require('../controllers/carController') const routes = [ { method: 'GET', url: '/api/cars', handler: carController.getCars }, { method: 'GET', url: '/api/cars/:id', handler: carController.getSingleCar }, { method: 'POST', url: '/api/cars', handler: carController.addCar, schema: documentation.addCarSchema }, { method: 'PUT', url: '/api/cars/:id', handler: carController.updateCar }, { method: 'DELETE', url: '/api/cars/:id', handler: carController.deleteCar } ] module.exports = routes
Здесь мы требуем наших контроллер и присвоение каждой из функций, которые мы создали в нашем контроллере на наши маршруты.
Как видите, каждый маршрут состоит из метода, URL и обработчика, инструктируя приложение, на котором используется функция, когда доступна одна из маршрутов.
: id
После некоторых маршрутов – это обычный способ пропустить параметры на маршруты, и это позволит нам получить доступ к ID следующим образом:
http://127.0.0.1:3000/api/cars/5bfe30b46fe410e1cfff2323
Положить все это вместе и тестирование нашего API
Теперь, когда у нас есть большинство наших построенных запчастей, нам просто нужно подключить их все вместе, чтобы начать обслуживание данных через наш API Отказ Во-первых, нам нужно импортировать наши маршруты что мы создали, добавив следующую строку кода на нашу главную index.js
файл:
const routes = require('./routes')
Затем нам нужно петить на наших маршрутах, чтобы инициатировать их с Застегивать. Мы можем сделать это со следующим кодом, который также должен быть добавлен к главному index.js
файл:
routes.forEach((route, index) => { fastify.route(route) })
Теперь мы готовы начать тестирование!
Лучший инструмент для работы – Почтальон , который мы будем использовать для проверки всех наших маршрутов. Мы будем отправлять наши данные как необработанные объекты в организме запроса и в качестве параметров.
Найти все автомобили:
Найти один автомобиль:
Добавление нового автомобиля **:
** Услуги кажутся пустыми, но информация на самом деле сохраняется в базе данных.
Обновление автомобиля:
Удаление автомобиля:
Теперь у нас есть полнофункциональный API – но как насчет документации? Это где Чугерс действительно удобно.
Добавление чванство и упаковка.
Теперь мы создадим нашу последнюю папку под названием конфигурация Внутри мы создадим файл под названием Swagger.js
со следующим кодом:
exports.options = { routePrefix: '/documentation', exposeRoute: true, swagger: { info: { title: 'Fastify API', description: 'Building a blazing fast REST API with Node.js, MongoDB, Fastify and Swagger', version: '1.0.0' }, externalDocs: { url: 'https://swagger.io', description: 'Find more info here' }, host: 'localhost', schemes: ['http'], consumes: ['application/json'], produces: ['application/json'] } }
Приведенный выше код является объектом с вариантами, которые мы перейдем в нашу Застеживать – чванство плагин. Для этого нам нужно добавить следующее на наш index.js
файл:
// Import Swagger Options const swagger = require('./config/swagger') // Register Swagger fastify.register(require('fastify-swagger'), swagger.options)
И тогда нам нужно добавить следующую строку после инициализации наших Застегивайте Сервер:
... await fastify.listen(3000) fastify.swagger() fastify.log.info(`listening on ${fastify.server.address().port}`) ...
И это так! Если вы сейчас перейдите к http://localhost: 3000/Документация , вы должны увидеть следующее:
Так просто, как, что! Теперь у вас есть дополнительная документация API, которая будет развиваться с вашим API. Вы можете легко добавить дополнительную информацию на свои маршруты, увидеть больше здесь Отказ
Что дальше?
Теперь, когда у нас есть базовый API на месте, возможности безграничны. Его можно использовать в качестве основы для любого приложения, которую можно себе приложение.
В следующем уроке мы будем интегрировать Graphql и в конечном итоге интегрируют интерфейс с Vue.js тоже!