การปฏิบัติของฉัน repo และหมายเหตุสำหรับการรับรอง JSNSD หัวข้อต่อไปนี้จะถูกกล่าวถึงใน repo นี้:
คู่มือการเริ่มต้นใช้งานเอกสาร 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 บนเบราว์เซอร์เพื่อตอบสนอง HTML ขั้นพื้นฐาน
การรวมการอดอาหารเข้ากับโครงการที่มีอยู่:
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/ เส้นทาง
ติดตั้งแพ็คเกจที่จำเป็น อ่านเพิ่มเติมเกี่ยวกับมุมมองและมือจับ
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 ในแอปพลิเคชันหลักของเรา
ไคลเอนต์ HTTP got การติดตั้งเพื่อความสะดวกในการใช้งานในแอปพลิเคชันของเรา
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 เพื่อทดสอบ API
ติดตั้งแพ็คเกจที่ต้องการ
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 )
} ) เยี่ยมชม URL: http://127.0.0.1:3000/06-proxy/?url=https://github.com/fastify
การใช้ HTTP Proxy: Single-Origin, Multi Route Proxy
ลงทะเบียนปลั๊กอินด้านล่างและส่งผ่านในวัตถุการกำหนดค่า พร็อกซีในตัวอย่างด้านล่างจะติดตั้งบน /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 คือ String)name คือ Array)name )มันง่ายกว่าที่จะบอก Fastify เพื่อตรวจสอบคำขอที่เข้ามาโดยใช้ JSON Schema เพียงเพิ่มวัตถุตัวเลือกด้วยสคีมา
{
schema : {
params : {
id : { type : 'number' } ,
} ,
body : {
type : 'object' ,
required : [ 'name' ] ,
additionalProperties : false ,
properties : {
name : { type : 'string' } ,
} ,
} ,
} ,
} , เราได้แนะนำการตรวจสอบความถูกต้องเป็นเส้นทางที่สอง /withValidation
name ให้มีคำขอที่ไม่ดี)name สามารถเป็นอาร์เรย์หรือสตริงได้) การใช้ additionalProperties: false ในสคีมาสามารถตัดคุณสมบัติที่ไม่จำเป็นออกไปถูกส่งผ่านไปยังตัวจัดการ
การตรวจสอบความถูกต้องสามารถนำไปใช้สำหรับการตอบกลับ คุณสมบัติเฉพาะที่กล่าวถึงในสคีมาเท่านั้น หากการตอบสนองไม่สอดคล้องกับข้อผิดพลาดของสคีมา
{
schema : {
response : {
201 : {
posted : { type : 'boolean' } ,
hello : { type : 'string' } ,
} ,
} ,
} ,
} ,Fluent-schema ยังสามารถใช้เพื่อกำหนด schemas เหล่านี้
เกือบจะปลอดภัย แต่สมมติว่าใครบางคนหรือบางคนกำลังทิ้งระเบิดเราด้วยคำขอสุ่ม (DOS) และทำให้ระบบของเราช้าลงหรือขูดบริการของเรา เพื่อให้ชีวิตของพวกเขายากขึ้นเล็กน้อยเราสามารถบล็อก IP ของพวกเขาในเซิร์ฟเวอร์ มาดูกันว่าเราสามารถทำสิ่งนั้นได้อย่างรวดเร็ว
เราสามารถสร้างปลั๊กอินและใช้ hooks 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 Schemas โดยอัตโนมัติจาก Schemas เส้นทาง ลงทะเบียนปลั๊กอินและใช้งานได้:
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' ,
} ,
} ,
} ) รายการของคอร์และปลั๊กอินชุมชนสามารถดูได้ที่นี่ ต่อไปนี้ปลั๊กอินและแพ็คเกจถูกนำมาใช้ในโครงการนี้
พร้อมที่จะเริ่มต้น?