ممارستي repo وملاحظات للحصول على شهادة JSNSD. يتم تغطية الموضوعات التالية في هذا الريبو:
دليل البدء على وثائق Fastify هو مورد ممتاز لإنشاء خادم أساسي.
إذا كنت ترغب في إنشاء مشروع Fastify بسرعة
npm init fastify
# install the dependencies
npm install
# run the dev server
npm run dev http://127.0.0.1:3000/01-basic بزيارة الطريق
دمج Fastify في مشروع موجود:
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/ path.
تثبيت الحزم اللازمة. اقرأ المزيد عن وجهة نظر ومقود.
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 GUT لسهولة الاستخدام في تطبيقنا.
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 لاختبار واجهة برمجة التطبيقات.
تثبيت الحزم المطلوبة
npm install fastify-reply-from fastify-http-proxyطريق واحد: وكيل متعدد الأصل
قم بتسجيل البرنامج المساعد وحدد المسار الذي سيعيد الاستجابة من عنوان URL الذي تم تمريره عبر معلمة الاستعلام. يقوم المكون الإضافي fastify-reply-from كائن reply بالمكون من وظيفة 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 )
} ) تفضل http://127.0.0.1:3000/06-proxy/?url=https://github.com/fastify URL:
باستخدام وكيل HTTP: أحادي الأصل ، وكيل متعدد المسار
قم بتسجيل البرنامج المساعد أدناه وقم بتمرير كائن التكوين. سيتم تركيب الوكيل في المثال أدناه على /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 سلسلة)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' } ,
} ,
} ,
} ,
} ,يمكن أيضًا استخدام Schema Fluent لتحديد هذه المخططات.
آمن تقريبًا ، ولكن دعنا نقول أن شخصًا ما أو شخص ما يقصفنا بطلبات عشوائية (DOS) وتسبب في إبطاء نظامنا أو تجريد خدماتنا. لجعل حياتهم أكثر صعوبة بعض الشيء ، يمكننا حظر IP الخاص بهم في الخادم. دعنا نلقي نظرة على كيف يمكننا القيام بذلك بسرعة.
يمكننا إنشاء مكون إضافي واستخدام السنانير Fastify لتحقيق ذلك.
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' ,
} ,
} ,
} ) يمكن العثور على قائمة الإضافات الأساسية والمجتمع هنا. تم استخدام الإضافات والحزم التالية في هذا المشروع.
جاهز للبدء؟