Как да създадете Node.js API с Fastify, MongoDB, Docker и POSTMAN

Поддържаща се и конфигурируема структура на API. Микро обслужване на архитектура. Очевидно мнение.

Създадено от Dooder - Freepik.com

В този урок ще изграждаме REST API в Node.js с Fastify frame. Ако не сте чували за Fastify, просто погледнете тук и не пропускайте БЕНЧМАРКИТЕ. Първо ще започнем да изграждаме прост API и постепенно ще преминем към добавяне на интеграция с API-та и база данни на трети страни.

Възбуден? ....... Да, не, може би?

Да видим Пътната карта

Част 1

  • Изградете прост API с един корен маршрут
  • Направете приложението конфигурируемо, като използвате конфигурационна карта
  • Създайте структура на папките за поддържане

Част 2

  • Интегрирайте с API на трети страни, за да получите някои данни
  • Интегрирайте се с MongoDB
  • Реализирайте основни потребителски регистрации и влизане с помощта на MongoDB и JWT
  • Докерирайте приложението
Бонус: Допълнително ще се интегрираме с Nodemailer и Amazon SES, за да проверим имейла на Потребителя чрез имейла.

Това е част 1 от нашата поредица от уроци.

Преди да продължим, имаме нужда

  • Основни познания за Javascript, Nodejs и API
  • Nodejs, инсталиран в системата.
  • Приличен редактор на код. Предпочитам Visual Studio Code.
  • POSTMAN - За да тестваме нашия API и да създадем макети за интеграция на API на трети страни

Да започваме.

Първо ще създадем проект на възел, използвайки npm init и ще добавим някои зависимости.

npm инсталирайте fastify fastify-autoload uuid

Нашият package.json трябва да изглежда така:

{
"name": "node-fastify-api-kottleplate",
"версия": "1.0.0",
"description": "Nodejs API котел с помощта на Fastify, MongoDB, Docker и Postman Mock",
"main": "app.js",
"скриптове": {
"test": "echo \" Грешка: не е посочен тест \ "&& изход 1"
}
"автор": "",
"лиценз": "ISC",
"зависимости": {
    "fastify": "^ 1.13.2",
    "fastify-autoload": "^ 0.5.1",
    "uuid": "^ 3.3.2"
}}

fastify

Fastify е уеб рамка, силно фокусирана върху осигуряване на най-доброто изживяване на разработчиците с най-малко режийни разходи и мощна архитектура на приставки. Той е вдъхновен от Hapi и Express и доколкото знаем, това е една от най-бързите уеб рамки в града. Източник: - https://www.fastify.io/

fastify-автоматично зареждане

пакет за зареждане на всички плъгини (маршрути, в нашия случай) от директория. Помага ни в избягването на многократен внос на нашите различни маршрути, съдържащи файлове.

UUID

Този пакет просто генерира uuid и закопчава двойки този uuid с всяка заявка под формата на идентификатор на заявка, което прави регистрирането на информацията за цялата верига заявки.

Сега ще създадем нов файл server.js в главната директория на нашия проект и ще му сложим следния код.

Горният код създава сървъра с конфигурация на един маршрут. За да стартираме това, трябва да стартираме node server.js и след това да отворим http: // localhost: 9000 в браузъра. Трябва да видите {"hello": "World"} в браузъра.

Въпреки че вече сме създали API сървър, това е САМО първата стъпка към създаването на API. Трябва да направим API модулен, конфигурируем и поддържан.

За да направим приложението конфигурируемо, ще създадем нов файл config / appSettings.json като конфигурационна карта и ще използваме nconf модул за четене на конфигурация от него. Ако не сте чували за конфигурационна карта, вижте тук.

Към момента този файл съдържа само едно свойство за конфигуриране. Ние ще добавяме почти всеки конфигурируем имот тук в този файл, от URL адреси на базата данни до тайни на приложението.

Сега ще създадем адаптер в config / configurationAdaptor.js, за да четем конфигурацията с помощта на nconf. Функцията loadSettings приема аргумент appSettingsPath, който е пътят към файла appSettings.json. Причината за преминаването на пътя тук е да се подготви производството на приложения. При производството файлът за конфигурация на appSettings.json може да бъде монтиран навсякъде, а не непременно в директорията на проекта.

Следващата стъпка е да се консумира по-горе създадената функция на адаптера loadSettings, за да се чете конфигурацията преди реално стартиране на сървъра. Ще създадем файл app.js, който ще действа като входна точка за нашето приложение. Той първо ще зареди конфигурационните свойства и след това ще стартира действителния сървър. Ние също трябва да актуализираме нашия server.js, за да изложим функция за реално стартиране на сървъра.

Ето актуализирания server.js с нова функция createServer, обвиваща кода за създаване и стартиране на сървъра.

app.js ще зареди настройките за конфигурация и ще стартира сървъра, използвайки createServerfunction, изложена от нашия server.js

Сега, за да стартираме app.js, трябва да зададем променлива среда APP_SETTINGS_FILE_PATH с пътя на нашия файл appSettings.json.

Ще изпълним следната команда

APP_SETTINGS_FILE_PATH = ”{Абсолютен път към appSettings.json}” възел app.js

горният начин за задаване на променлива на средата APP_SETTINGS_FILE_PATH е един от начините за задаване на променливи в средата. Можете да зададете променливите на средата по начина, по който искате. Използвам VS Code Debugging с конфигурации за стартиране. Вижте тук за извадката на start.json, която използвам в приложенията си.

След като стартирате сървъра с команда node app.js с вече зададената променлива APP_SETTINGS_FILE_PATH, вие ще можете да видите тези два регистрационни файла в конзолата си.

{
   "Ниво": 30,
   "Време": 1546037873556,
   "msg": "Сървърно слушане на http://127.0.0.1:9000",
   "PID": 15 660,
   "Име на хост": "PNQ-tarora",
   "V": 1
}
{
   "Ниво": 30,
   "Време": 1546037873558,
   "msg": "Сървър стартиран",
   "PID": 15 660,
   "Име на хост": "PNQ-tarora",
   "V": 1
}

Натиснете URL http: // localhost: 9000 в браузъра или POSTMAN. Отново ще можете да видите {"здравей": "Свят"} като изход.

Сега създадохме сървър, който може да се конфигурира. Можем да поставим почти всяка конфигурируема собственост в нашата appSettings.json, която не искаме да твърди код в нашата кодова база. Дали това е низ за връзка с база данни или регекс за паролата на потребителя. Ето пример за appSettings.json, който използвам в едно от моите приложения.

Следващата стъпка е да усъвършенстваме нашия server.js, за да го направим мащабируем и поддържан. Ще създадем специална папка, за да поставим нашите маршрути, вместо да поставяме всеки един маршрут в server.js

Ще премахнем следния ред от server.js

server.get ('/', функция за асинхронизация (заявка, отговор) {
   връщане {здравей: "Свят"}
})

и поставете маршрутите в api / route / root.js, използвайки синтаксиса fastify-autoload

и след това импортирайте маршрутите, използвайки fastify-autoload синтаксис в server.js.

Използвайки fastify-autoload, можем да създадем колкото се може повече вложени файлове под api / маршрути, без да е необходимо изрично да регистрираме всеки от тях на нашия сървър.

const AutoLoad = изисквам ('fastify-autoload');
const път = изисквам ('път');
server.register (AutoLoad, {
    dir: path.join (__ dirname, 'api', 'route')
});

след добавяне на горния набор от линии в server.js, трябва да изглежда така

Преглед на структурата на папките

основна структура на папките

Нашата структура на папките изглежда така, както досега. Ще добавяме още папки в папката api за други модули като адаптери, контролери, модели, помощни програми, валидации и т.н.

адаптери

тази папка ще съдържа файловете, отговорни за осъществяването на връзките с външния свят. Дали това е база данни или API на трети страни.

контролери

файловете в тази папка ще съдържат функции на контролери, вързани като маршрутизатори.

модели

моделира файлове за обработка на вътрешни и външни обекти

UTILS

тук ще бъдат увити всякакъв тип помощни функции (http-клиент, криптовалута, момент, Aws и т.н.).

потвърждения

както подсказва името, тук ще се обработва логиката на валидиране за нашите маршрути

картографи (незадължително)

файлове, които съдържат функции за картографиране за обработката на нашите данни и манипулиране според изискванията на API. Това не е задължително, но се препоръчва, тъй като помага за поддържането на чистите контролери, когато картографирането на данни стане сложно и трудно за четене във функция на контролер. Това също помага за повторна използваемост на кода.
Ето как изглежда структурата на папките след добавяне на гореспоменатите папки.

Най-накрая ще стартираме приложението още веднъж, за да видим как изглежда, когато всичко е на мястото си.

// стартира сървъра
APP_SETTINGS_FILE_PATH = ”{Абсолютен път към appSettings.json}” възел app.js
// сървъри за стартиране в конзолата
{
   "Ниво": 30,
   "Време": 1546166553407,
   "msg": "Сървърно слушане на http://127.0.0.1:9000",
   "PID": 23 196,
   "Име на хост": "PNQ-tarora",
   "V": 1
}
{
   "Ниво": 30,
   "Време": 1546166553410,
   "msg": "Сървър стартиран",
   "PID": 23 196,
   "Име на хост": "PNQ-tarora",
   "V": 1
}

Натиснете URL http: // localhost: 9000 в браузъра и POSTMAN.

Отговор на API в браузъраОтговор на API в Postman
// сървър регистрира след отправяне на заявката
{
   "Ниво": 30,
   "Време": 1546167028964,
   "msg": "входяща заявка",
   "PID": 23 196,
   "Име на хост": "PNQ-tarora",
   "ReqId": "5807fb5a-2b89-4a5f-9097-8f12edaf0b99",
   "REQ": {
      "ID": "5807fb5a-2b89-4a5f-9097-8f12edaf0b99",
      "Метод": "GET",
      "URL": "/",
      "Име на хост": "Localhost: 9000",
      "RemoteAddress": "127.0.0.1",
      "RemotePort": 54491
   }
   "V": 1
}
{
   "Ниво": 30,
   "Време": 1546167028967,
   "msg": "заявка приключи",
   "PID": 23 196,
   "Име на хост": "PNQ-tarora",
   "ReqId": "5807fb5a-2b89-4a5f-9097-8f12edaf0b99",
   "резолюция": {
      "StatusCode": 200
   }
   "RESPONSETIME": 2.815625011920929,
   "V": 1
}

Като странична забележка, използването на регистрационни файлове в конзолата трябва да бъде ограничено само до среда за разработка, като тези регистрационни файлове трябва да се поддържат в отделен файл или външна услуга за регистрация.

Изходен код: https://github.com/tarusharora/node-fastify-api-boilerplate

Какво следва?

Сега, когато имаме основен API на nodejs, следващата стъпка ще бъде да продължим с част 2 от тази серия, както беше обещано в пътната карта.
Ето оглед на това, което ще разгледаме в част 2.

Интеграция с API на трети страни за извличане на някои данни
Интеграция с MongoDB
Изпълнение на основни потребителски регистрация и влизане с помощта на MongoDB и JWT
Докинг на приложението