Praktek saya repo dan catatan untuk sertifikasi JSNSD. Topik berikut sedang dibahas dalam repo ini:
Panduan Memulai pada Dokumentasi Mengukur adalah sumber yang bagus untuk membuat server dasar.
Jika Anda ingin dengan cepat menghasilkan proyek pengisian ulang
npm init fastify
# install the dependencies
npm install
# run the dev server
npm run dev Kunjungi rute http://127.0.0.1:3000/01-basic di browser untuk respons HTML dasar.
Mengintegrasikan mengatasinya ke dalam proyek yang ada:
npm init fastify -- --integrateInstal Freattify-Static dan konfigurasikan direktori tertentu untuk disajikan.
npm install --save fastify-static Konfigurasikan di 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/' ,
} ) Kunjungi http://127.0.0.1:3000/02-static-content untuk file khusus dan http://127.0.0.1:3000/pub/about.html sejak direktori publik dipasang di /pub/ path.
Pasang paket yang diperlukan. Baca lebih lanjut tentang point-of-view dan setang.
npm install point-of-view handlebars Buat direktori view dan konfigurasikan aplikasi
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' ,
} ) Bangun rute sesuai di sini dan kunjungi http://127.0.0.1:3000/03-render-views?name=dina
Layanan yang harus dilakukan dasar yang akan memungkinkan operasi CRUD dan akan berinteraksi dengan database SQLite untuk persistansi.
npm install sequelize sqlite3 Plugin ditambahkan bahwa menghias instance fastify dengan fungsi models . Itu bisa menjadi objek juga.
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 }
} )
} )Sekarang Anda dapat menggunakan fungsi di rute
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
}
} ) Untuk ini, kami mengkonsumsi Rick dan Morty API di aplikasi utama kami.
Klien HTTP got diinstal untuk kemudahan penggunaan dalam aplikasi kami.
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
Gunakan file ./aggregate-test.http untuk menguji API.
Pasang paket yang diperlukan
npm install fastify-reply-from fastify-http-proxyRute Tunggal: Multi Asal Proxy
Daftarkan plugin dan tentukan rute yang akan mengembalikan respons dari URL yang dilewati melalui parameter kueri. Plugin fastify-reply-from menghias objek reply dengan from fungsi yang menerima 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 )
} ) Kunjungi URL: http://127.0.0.1:3000/06-proxy/?url=https://github.com/fastify
Menggunakan HTTP Proxy: Proxy Multi-Origin, Multi Route
Daftarkan plugin di bawah ini dan lewati objek konfigurasi. Proksi dalam contoh di bawah ini akan dipasang pada /rickandmorty .
fastify . register ( require ( 'fastify-http-proxy' ) , {
upstream : 'https://rickandmortyapi.com/api/episode' ,
prefix : '/rickandmorty' ,
} ) Kunjungi http://127.0.0.1:3000/rickandmorty/3 yang sekarang menjadi proxy untuk https://rickandmortyapi.com/api/episode/3
Polusi Parameter: Menyediakan beberapa parameter HTTP dengan nama yang sama dapat menyebabkan aplikasi menafsirkan nilai dengan cara yang tidak terduga. Dengan mengeksploitasi efek ini, penyerang mungkin dapat mem -bypass validasi input, memicu kesalahan aplikasi atau memodifikasi nilai variabel internal. Karena polusi parameter HTTP (singkatnya HPP) mempengaruhi blok bangunan semua teknologi web, server, dan serangan sisi klien.
Di rute /nameType pertama kami telah menangani 3 kasus polusi string kueri.
name string)name Array)name yang disediakan)Lebih mudah untuk memberi tahu pengisian ulang untuk memvalidasi permintaan yang masuk menggunakan skema JSON. Cukup tambahkan objek opsi dengan skema
{
schema : {
params : {
id : { type : 'number' } ,
} ,
body : {
type : 'object' ,
required : [ 'name' ] ,
additionalProperties : false ,
properties : {
name : { type : 'string' } ,
} ,
} ,
} ,
} , Kami telah memperkenalkan validasi adalah rute /withValidation kedua
name yang disediakan, permintaan yang buruk)name Bisa Array atau String) Menggunakan additionalProperties: false dalam skema dapat menghapus properti yang tidak perlu diturunkan ke pawang.
Validasi juga dapat diterapkan untuk respons. Hanya properti yang disebutkan dalam skema yang akan diekspos. Jika respons tidak sesuai dengan kesalahan skema akan dilemparkan.
{
schema : {
response : {
201 : {
posted : { type : 'boolean' } ,
hello : { type : 'string' } ,
} ,
} ,
} ,
} ,Skema yang lancar juga dapat digunakan untuk mendefinisikan skema ini.
Hampir aman, tetapi katakanlah seseorang atau SomeBot membombardir kami dengan permintaan acak (DOS) dan menyebabkan sistem kami memperlambat atau menggosok layanan kami. Untuk membuat hidup mereka sedikit lebih sulit, kita dapat memblokir IP mereka di server. Mari kita lihat bagaimana kita bisa melakukannya dengan sangat cepat.
Kami dapat membuat plugin dan menggunakan pengait pengisian untuk mencapai ini.
fastify . addHook ( 'onRequest' , async function ( request , reply ) {
if ( request . ip === '127.0.0.1' ) {
return reply . forbidden ( )
}
} ) Keajaiban dilakukan oleh plugin Freattify -wagger yang menghasilkan kesombongan (OpenAPI V2) atau skema OpenAPI V3 secara otomatis dari skema rute. Daftarkan plugin dan hanya berfungsi:
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' ,
} ,
} ,
} ) Daftar plugin inti dan komunitas dapat ditemukan di sini. Plugin dan paket berikut digunakan dalam proyek ini.
Siap Memulai?