Мой практический репо и примечания для сертификации JSNSD. Следующие темы рассматриваются в этом репо:
Руководство по началу работы по документированию фазвии является отличным ресурсом для создания базового сервера.
Если вы хотите быстро генерировать проект фазвии
npm init fastify
# install the dependencies
npm install
# run the dev server
npm run dev Посетите маршрут http://127.0.0.1:3000/01-basic в браузере для базового ответа HTML.
Интеграция фастификации в существующий проект:
npm init fastify -- --integrateУстановите Fastify-Static и настройте определенный каталог для обслуживания.
npm install --save fastify-static Настройка в app.js
const fastifyStatic = require ( 'fastify-static' )
/** @type import('fastify').FastifyPluginAsync */
module . exports = async function ( fastify , opts ) {
// Place here your custom code!
fastify . register ( fastifyStatic , {
root : path . join ( __dirname , 'public' ) ,
prefix : '/pub/' ,
} ) Посетите http://127.0.0.1:3000/02-static-content для пользовательского файла и http://127.0.0.1:3000/pub/about.html , поскольку публичный каталог установлен на /pub/ pub.
Установите необходимые пакеты. Узнайте больше о точке зрения и руле.
npm install point-of-view handlebars Создать каталог view и настроить приложение
const pointOfView = require ( 'point-of-view' )
const handlebars = require ( 'handlebars' )
/** @type import('fastify').FastifyPluginAsync */
module . exports = async function ( fastify , opts ) {
fastify . register ( pointOfView , {
engine : { handlebars } ,
root : path . join ( __dirname , 'views' ) ,
layout : 'layout.hbs' ,
} ) Создайте маршруты в соответствии с здесь и посетите http://127.0.0.1:3000/03-render-views?name=dina
Основная служба дел, которая позволит работать в CRUD и будет взаимодействовать с базой данных SQLite для стойкости.
npm install sequelize sqlite3 Добавлен плагин, который декорирует экземпляр fastify с функцией models . Это также может быть объект.
const fp = require ( 'fastify-plugin' )
const { db } = require ( '../db' )
// initialize models
const makeTodoModel = require ( '../models/todo' )
const Todo = makeTodoModel ( db )
module . exports = fp ( async function ( fastify , opts ) {
fastify . decorate ( 'models' , function ( ) {
return { db , Todo }
} )
} )Теперь вы можете использовать функцию на маршрутах
module . exports = async ( fastify , opts ) => {
const { Todo } = fastify . models ( )
fastify . get ( '/' , async ( request , reply ) => {
try {
const todos = await Todo . findAll ( )
return todos . map ( ( t ) => t . toJSON ( ) )
} catch ( error ) {
throw error
}
} ) Для этого мы потребляем Rick и Morty API в нашем основном приложении.
got клиент HTTP для простоты использования в нашем приложении.
npm i got
# define following env variables that will be used by the service.
# injecting variables this way is normal for consuming from dynamic dependent
# services
export CHARACTER_SERVICE=https://rickandmortyapi.com/api/character
export LOCATION_SERVICE=https://rickandmortyapi.com/api/location
Используйте файл ./aggregate-test.http , чтобы проверить API.
Установите необходимые пакеты
npm install fastify-reply-from fastify-http-proxyОдиночный маршрут: прокси -сервер с несколькими происхождением
Зарегистрируйте плагин и определите маршрут, который вернет ответ из URL -адреса, пройденного через параметр запроса. Плагин fastify-reply-from reply OF from , который принимает URL-адреса.
fastify . get ( '/' , async function ( request , reply ) {
const { url } = request . query
try {
new URL ( url )
} catch ( err ) {
throw fastify . httpErrors . badRequest ( )
}
return reply . from ( url )
} ) Посетите URL: http://127.0.0.1:3000/06-proxy/?url=https://github.com/fastify
Использование HTTP Proxy: одноэтажный, Multi Route Proxy
Зарегистрируйте плагин ниже и передайте в объекте конфигурации. Прокси в приведенном ниже примере будет установлен на /rickandmorty .
fastify . register ( require ( 'fastify-http-proxy' ) , {
upstream : 'https://rickandmortyapi.com/api/episode' ,
prefix : '/rickandmorty' ,
} ) Посетите http://127.0.0.1:3000/rickandmorty/3 , который теперь является прокси -сервисом https://rickandmortyapi.com/api/episode/3
Загрязнение параметров: поставка нескольких параметров HTTP с одним и тем же именем может привести к интерпретации значений непредвиденными способами. Используя эти эффекты, злоумышленник может обойти входную проверку, запустить ошибки приложения или изменить значения внутренних переменных. Поскольку загрязнение параметров HTTP (в коротком HPP) влияет на строительный блок всех веб-технологий, существуют атаки сервера и на стороне клиента.
В первом маршруте /nameType мы рассмотрели 3 случая загрязнения строки запросов.
name string)name массив)name )Легче просто сказать Fastify для проверки входящих запросов с использованием схемы JSON. Просто добавьте объект параметров со схемой
{
schema : {
params : {
id : { type : 'number' } ,
} ,
body : {
type : 'object' ,
required : [ 'name' ] ,
additionalProperties : false ,
properties : {
name : { type : 'string' } ,
} ,
} ,
} ,
} , Мы ввели проверка - второй маршрут /withValidation
name не предоставляется, плохой запрос)name может быть массивом или строкой) Использование additionalProperties: false in Schema может лишить ненужные свойства, передаваемые вниз к обработчику.
Валидация также может быть применена для ответа. Только свойства, упомянутые в схеме, будут выставлены. Если ответ не соответствует ошибке схемы.
{
schema : {
response : {
201 : {
posted : { type : 'boolean' } ,
hello : { type : 'string' } ,
} ,
} ,
} ,
} ,Fluent-Schema также может быть использована для определения этих схем.
Почти безопасно, но, скажем, кто -то или Somebot бомбардирует нас случайными запросами (DOS) и заставляет нашу систему замедляться или ее соскребает наши услуги. Чтобы сделать их жизнь немного сложнее, мы можем заблокировать их IP на сервере. Давайте посмотрим, как мы можем сделать это очень быстро.
Мы можем создать плагин и использовать зафтовые крючки для достижения этого.
fastify . addHook ( 'onRequest' , async function ( request , reply ) {
if ( request . ip === '127.0.0.1' ) {
return reply . forbidden ( )
}
} ) Магия осуществляется плагином Fastify-Swagger, который автоматически генерирует Swagger (OpenAPI V2) или OpenAPI V3 из схемы маршрута. Зарегистрируйте плагин, и он просто работает:
fastify . register ( require ( 'fastify-swagger' ) , {
routePrefix : '/doc' ,
exposeRoute : true ,
openapi : {
openapi : '3.0.3' ,
info : {
title : 'JSNSD' ,
description : 'Testing the Fastify swagger API' ,
version : '0.1.0' ,
} ,
externalDocs : {
url : 'https://swagger.io' ,
description : 'Find more info here' ,
} ,
} ,
} ) Список основных и общественных плагинов можно найти здесь. Следующие плагины и пакеты использовались в этом проекте.
Готовы начать работу?