Mi práctica repos y notas para la certificación JSNSD. Los siguientes temas se están cubriendo en este repositorio:
La guía de inicio sobre la documentación de Fastify es un recurso excelente para crear un servidor básico.
Si desea generar rápidamente un proyecto de Fastify
npm init fastify
# install the dependencies
npm install
# run the dev server
npm run dev Visite la ruta http://127.0.0.1:3000/01-basic en el navegador para obtener una respuesta HTML básica.
Integrar Fastify en un proyecto existente:
npm init fastify -- --integrateInstale Fastify-Static y configure un directorio particular para servir.
npm install --save fastify-static Configurar en 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 el archivo personalizado y http://127.0.0.1:3000/pub/about.html ya que el directorio público está montado en /pub/ ruta.
Instale los paquetes necesarios. Lea más sobre el punto de vista y el manillar.
npm install point-of-view handlebars Crear un directorio view y configurar la aplicación
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' ,
} ) Cree las rutas según aquí y visite http://127.0.0.1:3000/03-render-views?name=dina
Un servicio básico de tareas pendientes que permitirá las operaciones de CRUD e interactuará con una base de datos SQLite para su persistencia.
npm install sequelize sqlite3 Se agrega un complemento que decora la instancia fastify con la función models . También puede ser un objeto.
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 }
} )
} )Ahora puede usar la función en las rutas
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 esto, estamos consumiendo API Rick y Morty en nuestra aplicación principal.
got instala un cliente HTTP para facilitar la facilidad de uso en nuestra aplicación.
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 el archivo ./aggregate-test.http para probar la API.
Instale los paquetes requeridos
npm install fastify-reply-from fastify-http-proxyRuta única: proxy de origen múltiple
Registre el complemento y defina la ruta que devolverá la respuesta de la URL pasada a través del parámetro de consulta. El complemento fastify-reply-from Decret reply Object con from función que acepta 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 )
} ) Visite URL: http://127.0.0.1:3000/06-proxy/?url=https://github.com/fastify
Uso de proxy http: proxy de ruta múltiple de origen único
Registre el complemento a continuación y pase en el objeto de configuración. El proxy en el siguiente ejemplo se montará en /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 ahora es un proxy de https://rickandmortyapi.com/api/episode/3
Contaminación de los parámetros: el suministro de múltiples parámetros HTTP con el mismo nombre puede hacer que una aplicación interprete valores de maneras no anticipadas. Al explotar estos efectos, un atacante puede evitar la validación de entrada, activar errores de aplicación o modificar los valores de variables internas. Como la contaminación de los parámetros HTTP (en resumen HPP) afecta un bloque de construcción de todas las tecnologías web, los ataques de servidor y del lado del cliente.
En la primera ruta /nameType hemos manejado 3 casos de contaminación de cadenas de consulta.
name es cadena)name es una matriz)name )Es más fácil decirle a Fastify que valida las solicitudes entrantes utilizando el esquema JSON. Simplemente agregue el objeto Opciones con el esquema
{
schema : {
params : {
id : { type : 'number' } ,
} ,
body : {
type : 'object' ,
required : [ 'name' ] ,
additionalProperties : false ,
properties : {
name : { type : 'string' } ,
} ,
} ,
} ,
} , Hemos introducido la validación es la segunda ruta /withValidation
name , mala solicitud)name puede ser una matriz o cadena) Uso de additionalProperties: false en el esquema puede eliminar las propiedades innecesarias que se transmiten al controlador.
La validación también se puede aplicar para la respuesta. Solo se expusirán las propiedades mencionadas en el esquema. Si la respuesta no se ajusta al error del esquema se lanzará.
{
schema : {
response : {
201 : {
posted : { type : 'boolean' } ,
hello : { type : 'string' } ,
} ,
} ,
} ,
} ,El esquema con fluidez también se puede usar para definir estos esquemas.
Casi seguro, pero digamos que alguien o Somebot nos está bombardeando con solicitudes aleatorias (DOS) y haciendo que nuestro sistema disminuya la velocidad o que raspen nuestros servicios. Para hacer su vida un poco más difícil, podemos bloquear su IP en el servidor. Veamos cómo podemos hacerlo muy rápido.
Podemos crear un complemento y usar Fastify Hooks para lograr esto.
fastify . addHook ( 'onRequest' , async function ( request , reply ) {
if ( request . ip === '127.0.0.1' ) {
return reply . forbidden ( )
}
} ) La magia se realiza mediante el complemento Fastify-Swagger que genera esquemas Swagger (Openapi V2) o OpenAPI V3 automáticamente desde los esquemas de ruta. Registre el complemento y simplemente 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' ,
} ,
} ,
} ) La lista de complementos centrales y comunitarios se puede encontrar aquí. Los siguientes complementos y paquetes se utilizaron en este proyecto.
¿Listo para comenzar?