Рубрики
Без рубрики

Как построить пылагородчивость быстрого отдыха API с Node.js, MongoDB, Castify и Swagger

Предположительно, веб-разработчик не является незнакомцем для отдыха API и проблемы, которые приносят архитектуру эффективного и эффективного решения API. Эти проблемы включают в себя документацию: скорость (времена отклика API) (четкие лаконичные документы, описывающие API) архитектуру и устойчивость (поддерживаемые и расширяемые кодовые базы) в этом руководстве мы собираемся

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