Mein Praxis -Repo und Notizen zur JSNSD -Zertifizierung. Die folgenden Themen werden in diesem Repo behandelt:
Erste Anleitung zur Fasty -Dokumentation ist eine hervorragende Ressource für das Erstellen eines Basisservers.
Wenn Sie schnell ein Fastify -Projekt erstellen möchten
npm init fastify
# install the dependencies
npm install
# run the dev server
npm run dev Besuchen Sie die Route http://127.0.0.1:3000/01-basic auf dem Browser, um eine grundlegende HTML-Antwort zu erhalten.
Integration von Fastify in ein vorhandenes Projekt:
npm init fastify -- --integrateInstallieren Sie Fastify-statisch und konfigurieren Sie ein bestimmtes Verzeichnis, um zu dienen.
npm install --save fastify-static Konfigurieren Sie im 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/' ,
} ) Besuchen Sie http://127.0.0.1:3000/02-static-content für die benutzerdefinierte Datei und http://127.0.0.1:3000/pub/about.html , da das öffentliche Verzeichnis auf /pub/ path montiert ist.
Installieren Sie die erforderlichen Pakete. Lesen Sie mehr über Sach- und Lenker.
npm install point-of-view handlebars Erstellen Sie ein view und konfigurieren Sie die App
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' ,
} ) Erstellen Sie die Routen nach hier und besuchen Sie http://127.0.0.1:3000/03-render-views?name=dina
Ein grundlegender To-Do-Service, der CRUD-Operationen ermöglicht und mit einer SQLite-Datenbank für Beharrlichkeit interagiert.
npm install sequelize sqlite3 Es wird ein Plugin hinzugefügt, das fastify -Instanz mit models dekoriert. Es kann auch ein Objekt sein.
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 }
} )
} )Jetzt können Sie die Funktion in den Routen verwenden
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
}
} ) Dafür verbrauchen wir Rick und Morty -API in unserer Hauptanwendung.
Ein HTTP got ist für die Benutzerfreundlichkeit in unserer Anwendung installiert.
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
Verwenden Sie die Datei ./aggregate-test.http um die API zu testen.
Installieren Sie die erforderlichen Pakete
npm install fastify-reply-from fastify-http-proxyEinzelroute: Multi Origin Proxy
Registrieren Sie das Plugin und definieren Sie die Route, die die Antwort von der URL über den Abfrageparameter zurückgibt. Das Plugin fastify-reply-from Dekoration von reply mit from Funktion, die URLs akzeptiert.
fastify . get ( '/' , async function ( request , reply ) {
const { url } = request . query
try {
new URL ( url )
} catch ( err ) {
throw fastify . httpErrors . badRequest ( )
}
return reply . from ( url )
} ) Besuchen Sie URL: http://127.0.0.1:3000/06-proxy/?url=https://github.com/fastify
Verwenden Sie HTTP-Proxy: Single-Origin-, Multi-Route-Proxy
Registrieren Sie das Plugin unten und geben Sie das Konfigurationsobjekt über. Der Proxy im folgenden Beispiel wird auf /rickandmorty montiert.
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
Parameterverschmutzung: Die Lieferung mehrerer HTTP -Parameter mit demselben Namen kann dazu führen, dass eine Anwendung Werte auf unerwartete Weise interpretiert. Durch die Nutzung dieser Effekte kann ein Angreifer möglicherweise die Eingabevalidierung umgehen, Anwendungsfehler auslösen oder die Werte der internen Variablen ändern. Da die HTTP-Parameterverschmutzung (in kurzer HPP) einen Baustein aller Web-Technologien betrifft, existieren Server- und clientseitige Angriffe.
In der ersten Route /nameType haben wir 3 Fälle von Abfragestöneverschmutzung behandelt.
name ist String)name ist Array)name angegeben)Es ist einfacher, Fastify einfach zu sagen, um die eingehenden Anforderungen mit JSON -Schema zu validieren. Fügen Sie einfach Optionsobjekt mit Schema hinzu
{
schema : {
params : {
id : { type : 'number' } ,
} ,
body : {
type : 'object' ,
required : [ 'name' ] ,
additionalProperties : false ,
properties : {
name : { type : 'string' } ,
} ,
} ,
} ,
} , Wir haben die Validierung eingeführt, ist die zweite Route /withValidation
name wird angegeben, schlechte Anfrage)name kann Array oder String sein) Verwendung additionalProperties: false im Schema kann unnötige Eigenschaften ausstreifen, die an den Handler weitergegeben werden.
Die Validierung kann auch für die Antwort angewendet werden. Nur im Schema erwähnte Eigenschaften werden freigelegt. Wenn die Antwort nicht dem Schema -Fehler entspricht.
{
schema : {
response : {
201 : {
posted : { type : 'boolean' } ,
hello : { type : 'string' } ,
} ,
} ,
} ,
} ,Das fließende Schema kann auch verwendet werden, um diese Schemata zu definieren.
Fast sicher, aber sagen wir, dass jemand oder ein SOBOT uns mit zufälligen Anfragen (DOs) bombardiert und unser System verlangsamt oder unsere Dienste abkratzen. Um ihr Leben etwas schwieriger zu machen, können wir ihre IP auf dem Server blockieren. Schauen wir uns an, wie wir das sehr schnell machen können.
Wir können ein Plugin erstellen und Fastify -Hooks verwenden, um dies zu erreichen.
fastify . addHook ( 'onRequest' , async function ( request , reply ) {
if ( request . ip === '127.0.0.1' ) {
return reply . forbidden ( )
}
} ) Die Magie erfolgt vom Fastify-Swagger-Plugin, das Swagger (OpenAPI V2) oder OpenAPI V3-Schemas automatisch aus den Routenschemata erzeugt. Registrieren Sie das Plugin und es funktioniert nur:
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' ,
} ,
} ,
} ) Die Liste der Kern- und Community -Plugins finden Sie hier. In diesem Projekt wurden folgende Plugins und Pakete verwendet.
Bereit, loszulegen?