Автор оригинала: 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 тоже!