Meu repo e anotações práticas para a certificação JSNSD. A seguir, os tópicos estão sendo abordados neste repositório:
O guia de início da documentação do Fastify é um excelente recurso para criar um servidor básico.
Se você deseja gerar rapidamente um projeto Fastify
npm init fastify
# install the dependencies
npm install
# run the dev server
npm run dev Visite a rota http://127.0.0.1:3000/01-basic no navegador para obter uma resposta básica de HTML.
Integração do Fastify em um projeto existente:
npm init fastify -- --integrateInstale o Fastify-Static e configure um diretório específico para servir.
npm install --save fastify-static Configure no 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/' ,
} ) Visite http://127.0.0.1:3000/02-static-content para o arquivo personalizado e http://127.0.0.1:3000/pub/about.html Como o diretório público é montado em /pub/ path.
Instale os pacotes necessários. Leia mais sobre o ponto de vista e o guidão.
npm install point-of-view handlebars Crie um diretório view e configure o aplicativo
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' ,
} ) Construa as rotas conforme aqui e visite http://127.0.0.1:3000/03-render-views?name=dina
Um serviço básico de tarefa que permitirá operações da CRUD e interagirá com um banco de dados SQLite para persistência.
npm install sequelize sqlite3 É adicionado um plug -in que decora a instância fastify com a função models . Pode ser um objeto também.
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 }
} )
} )Agora você pode usar a função nas rotas
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
}
} ) Para isso, estamos consumindo API Rick e Morty em nossa aplicação principal.
Um cliente HTTP got é instalado para a facilidade de uso em nosso aplicativo.
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
Use o arquivo ./aggregate-test.http para testar a API.
Instale os pacotes necessários
npm install fastify-reply-from fastify-http-proxyRota única: proxy de origem múltipla
Registre o plug -in e defina a rota que retornará a resposta do URL passada pelo parâmetro de consulta. O plug-in fastify-reply-from decora o objeto reply com from função que aceita URLs.
fastify . get ( '/' , async function ( request , reply ) {
const { url } = request . query
try {
new URL ( url )
} catch ( err ) {
throw fastify . httpErrors . badRequest ( )
}
return reply . from ( url )
} ) Visite URL: http://127.0.0.1:3000/06-proxy/?url=https://github.com/fastify
Usando o proxy HTTP: origem única, proxy de rota múltipla
Registre o plug -in abaixo e passe no objeto de configuração. O proxy no exemplo abaixo será montado em /rickandmorty .
fastify . register ( require ( 'fastify-http-proxy' ) , {
upstream : 'https://rickandmortyapi.com/api/episode' ,
prefix : '/rickandmorty' ,
} ) Visite http://127.0.0.1:3000/rickandmorty/3 , que agora é um proxy para https://rickandmortyapi.com/api/episode/3
Poluição do parâmetro: O fornecimento de vários parâmetros HTTP com o mesmo nome pode causar um aplicativo para interpretar valores de maneiras imprevistas. Ao explorar esses efeitos, um invasor pode ignorar a validação de entrada, acionar erros de aplicação ou modificar valores de variáveis internas. Como a poluição do parâmetro HTTP (em HPP curto) afeta um bloco de construção de todas as tecnologias da Web, existem ataques de servidor e do lado do cliente.
Na primeira rota /nameType lidamos com 3 casos de poluição da cadeia de consulta.
name é string)name é matriz)name fornecido)É mais fácil dizer ao Fastify para validar as solicitações recebidas usando o JSON Schema. Basta adicionar opções objeto com esquema
{
schema : {
params : {
id : { type : 'number' } ,
} ,
body : {
type : 'object' ,
required : [ 'name' ] ,
additionalProperties : false ,
properties : {
name : { type : 'string' } ,
} ,
} ,
} ,
} , Introduzimos a validação é a segunda rota /withValidation
name é fornecido, má solicitação)name pode ser matriz ou string) Usando additionalProperties: false no esquema pode retirar propriedades desnecessárias sendo transmitidas para o manipulador.
A validação também pode ser aplicada para a resposta. Somente as propriedades mencionadas no esquema serão expostas. Se a resposta não estiver em conformidade com o erro do esquema será lançado.
{
schema : {
response : {
201 : {
posted : { type : 'boolean' } ,
hello : { type : 'string' } ,
} ,
} ,
} ,
} ,O esquema fluente também pode ser usado para definir esses esquemas.
Quase seguro, mas digamos que alguém ou alguém esteja nos bombardeando com solicitações aleatórias (DOS) e fazendo com que nosso sistema diminua a velocidade ou a eliminação de nossos serviços. Para dificultar a vida deles, podemos bloquear o IP no servidor. Vamos ver como podemos fazer isso muito rapidamente.
Podemos criar um plug -in e usar ganchos Fastify para conseguir isso.
fastify . addHook ( 'onRequest' , async function ( request , reply ) {
if ( request . ip === '127.0.0.1' ) {
return reply . forbidden ( )
}
} ) A magia é feita pelo plug-in Fastify-Swagger que gera swagger (OpenAPI v2) ou esquemas OpenAPI V3 automaticamente dos esquemas de rota. Registre o plugin e ele apenas funciona:
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' ,
} ,
} ,
} ) A lista de plugins principais e comunitários pode ser encontrada aqui. Os seguintes plugins e pacotes foram usados neste projeto.
Pronto para começar?