Mon référentiel de pratique et notes pour la certification JSNSD. Les sujets suivants sont couverts dans ce dépôt:
Guide de démarrage sur la documentation Fintify est une excellente ressource pour créer un serveur de base.
Si vous souhaitez générer rapidement un projet FASTIFY
npm init fastify
# install the dependencies
npm install
# run the dev server
npm run dev Visitez l'itinéraire http://127.0.0.1:3000/01-basic sur le navigateur pour une réponse HTML de base.
Intégration de FASCIFY dans un projet existant:
npm init fastify -- --integrateInstallez Fastify-Static et configurez un répertoire particulier pour servir.
npm install --save fastify-static Configurer dans l' 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/' ,
} ) Visitez http://127.0.0.1:3000/02-static-content pour le fichier personnalisé et http://127.0.0.1:3000/pub/about.html puisque le répertoire public est monté sur /pub/ path.
Installez les packages nécessaires. En savoir plus sur le point de vue et le guidon.
npm install point-of-view handlebars Créer un répertoire view et configurer l'application
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' ,
} ) Construisez les itinéraires selon ici et visitez http://127.0.0.1:3000/03-render-views?name=dina
Un service de base de tâches qui permettra des opérations CRUD et interagira avec une base de données SQLite pour la persistance.
npm install sequelize sqlite3 Un plugin est ajouté qui décorerait l'instance fastify avec la fonction models . Cela peut également être un objet.
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 }
} )
} )Maintenant, vous pouvez utiliser la fonction dans les routes
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
}
} ) Pour cela, nous consommons Rick et Morty API dans notre application principale.
Un client HTTP got est installé pour la facilité d'utilisation dans notre application.
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
Utilisez le fichier ./aggregate-test.http pour tester l'API.
Installez les packages requis
npm install fastify-reply-from fastify-http-proxyItinéraire unique: proxy multi-origine
Enregistrez le plugin et définissez l'itinéraire qui renverra la réponse de l'URL transmise par le paramètre de requête. Le plugin fastify-reply-from décore l'objet reply avec from la fonction qui accepte les 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 )
} ) Visitez URL: http://127.0.0.1:3000/06-proxy/?url=https://github.com/fastify
Utilisation du proxy HTTP: proxy à original unique, multi-routes
Enregistrez le plugin ci-dessous et passez dans l'objet de configuration. Le proxy dans l'exemple ci-dessous sera monté sur /rickandmorty .
fastify . register ( require ( 'fastify-http-proxy' ) , {
upstream : 'https://rickandmortyapi.com/api/episode' ,
prefix : '/rickandmorty' ,
} ) Visitez http://127.0.0.1:3000/rickandmorty/3 qui est maintenant un proxy à https://rickandmortyapi.com/api/episode/3
Pollution des paramètres: fournir plusieurs paramètres HTTP avec le même nom peut entraîner une application d'interpréter les valeurs de manière imprévue. En exploitant ces effets, un attaquant peut être en mesure de contourner la validation d'entrée, de déclencher des erreurs d'application ou de modifier les valeurs des variables internes. Au fur et à mesure que la pollution du paramètre HTTP (en HPP court) affecte un bloc de construction de toutes les technologies Web, des attaques côté serveur et client existent.
Dans le premier itinéraire /nameType nous avons géré 3 cas de pollution de la chaîne de requête.
name est string)name est le tableau)name fourni)Il est plus facile de simplement dire à Fintify pour valider les demandes entrantes en utilisant le schéma JSON. Ajoutez simplement des options objet avec le schéma
{
schema : {
params : {
id : { type : 'number' } ,
} ,
body : {
type : 'object' ,
required : [ 'name' ] ,
additionalProperties : false ,
properties : {
name : { type : 'string' } ,
} ,
} ,
} ,
} , Nous avons introduit la validation est le deuxième itinéraire /withValidation
name n'est fourni, mauvaise demande)name peut être un tableau ou une chaîne) Utilisation additionalProperties: false dans le schéma peut éliminer les propriétés inutiles transmises au gestionnaire.
La validation peut également être appliquée pour la réponse. Seules les propriétés mentionnées dans le schéma seront exposées. Si la réponse ne se conforme pas à l'erreur de schéma lancé.
{
schema : {
response : {
201 : {
posted : { type : 'boolean' } ,
hello : { type : 'string' } ,
} ,
} ,
} ,
} ,Le schéma fluide peut également être utilisé pour définir ces schémas.
Presque sécurisé, mais disons que quelqu'un ou quelque part nous bombarde avec des demandes aléatoires (DOS) et que notre système ralentit ou son raclage de nos services. Pour rendre leur vie un peu plus difficile, nous pouvons bloquer leur IP dans le serveur. Voyons comment nous pouvons faire cela très rapidement.
Nous pouvons créer un plugin et utiliser Fintify Hooks pour y parvenir.
fastify . addHook ( 'onRequest' , async function ( request , reply ) {
if ( request . ip === '127.0.0.1' ) {
return reply . forbidden ( )
}
} ) La magie est réalisée par le plugin Fastify-Swagger qui génère automatiquement les schémas Swagger (OpenAPI V2) ou OpenAPI V3 à partir des schémas d'itinéraire. Enregistrez le plugin et cela fonctionne:
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 liste des plugins de base et communautaire peut être trouvée ici. Les plugins et packages suivants ont été utilisés dans ce projet.
Prêt à commencer?